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。在我的例子中,我想找到每个 USDT
和 ETH
组合的最后一行,所以我的结果是:
| 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;
如果您的 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';
我有问题。在我的数据库中,我有以下 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。在我的例子中,我想找到每个 USDT
和 ETH
组合的最后一行,所以我的结果是:
| 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;
如果您的 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';