【问题标题】:MariaDB Find max in group of 3 columns [duplicate]MariaDB在3列组中查找最大值[重复]
【发布时间】:2021-12-23 20:36:11
【问题描述】:

我有问题。在我的数据库中,我有下表:

| openTime      | market | coin | period |
|---------------|--------|------|--------|
| 1635768000000 | USDT   | ETH  | 1h     |
| 1635764400000 | USDT   | ETH  | 1h     |
| 1635760800000 | USDT   | ETH  | 1h     |
| 1635768000000 | USDT   | ETH  | 2h     |
| 1635760800000 | USDT   | ETH  | 2h     |
| 1635753600000 | USDT   | ETH  | 2h     |
| 1635768000000 | USDT   | BTC  | 1h     |
| 1635764400000 | USDT   | BTC  | 1h     |

现在我要查询的是给出市场和硬币的每个市场硬币周期组合的最后一个 openTime。就我而言,我想找到每个 USDTETH 组合的最后一行,所以我的结果是:

| openTime      | market | coin | period |
|---------------|--------|------|--------|
| 1635768000000 | USDT   | ETH  | 1h     |
| 1635768000000 | USDT   | ETH  | 2h     |

我已经尝试过这样的查询:

SELECT * FROM (SELECT * FROM Candlestick WHERE market = 'USDT' AND coin = 'ETH') a WHERE a.openTime IN (SELECT MAX(openTime) FROM (SELECT * FROM Candlestick) b GROUP BY b.period) GROUP BY a.coin, a.period;

但这给我返回了一个奇怪的结果,我得到了某种最新的行,但不是 ETH 的最后一行。有人可以帮帮我吗?

PS:我在跑:10.3.31-MariaDB-0ubuntu0.20.04.1-log Ubuntu 20.04

【问题讨论】:

    标签: mysql sql mariadb


    【解决方案1】:

    如果您使用的是 MySQL 8+,请在此处使用ROW_NUMBER

    WITH cte AS (
        SELECT *, ROW_NUMBER() OVER (PARTITION BY period ORDER BY openTime DESC) rn
        FROM yourTable
        WHERE market = 'USDT' AND coin = 'ETH'
    )
    
    SELECT openTime, market, coin, period
    FROM cte
    WHERE rn = 1;
    

    Demo

    如果您的 MariaDB 版本不支持ROW_NUMBER,这是一种使用联接的方法:

    SELECT t1.openTime, t1.market, t1.coin, t1.period
    FROM yourTable t1
    INNER JOIN
    (
        SELECT period, MAX(openTime) AS maxOpenTime
        FROM yourTable
        WHERE market = 'USDT' AND coin = 'ETH'
        GROUP BY period
    ) t2
        ON t2.period = t1.period AND
           t1.openTime = t2.maxOpenTime AND
           t1.market = 'USDT' AND
           t1.coin = 'ETH';
    

    Demo

    【讨论】:

    • @A.Vreeswijk 此代码必须在您的 MaraDB 版本中工作。 dbfiddle.uk/…
    • @Akina ROW_NUMBER 仅支持 MariaDB 版本 10.2 或更高版本。可以想象,OP 使用的是旧版本。
    • OP 告诉他使用 10.3.31-MariaDB-0ubuntu0.20.04.1-log Ubuntu 20.04
    • 是的,两个代码段都在工作!但是,第一个对我的数据来说太长了。我有大约 600 万条记录,查询大约需要 1 分钟。第二个真快!
    • 您的性能观察确实很奇怪,因为ROW_NUMBER 已在内部优化为非常快。我无法解释为什么第二个版本更快。
    猜你喜欢
    • 2015-05-01
    • 2012-10-20
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    相关资源
    最近更新 更多