MariaDB 在 3 列组中查找最大值

MariaDB Find max in group of 3 columns

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

| 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;

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

PS:我是运行:10.3.31-MariaDB-0ubuntu0.20.04.1-log Ubuntu 20.04

如果您使用的是 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