获取具有最高值的行 - 如果多行采用另一个条件
Posted
技术标签:
【中文标题】获取具有最高值的行 - 如果多行采用另一个条件【英文标题】:Getting row with highest value - if multiple rows take another condition 【发布时间】:2021-09-17 10:13:39 【问题描述】:我有一个存储“投标”的表格。我需要获得每组数量最多的行(PlayerID)。但是,如果由于“出价”而同时出现多行,我需要获取最早的行(BidDate)。
我的表格和考试日期如下所示 (DB-Fiddle):
CREATE TABLE bid(
BidID integer PRIMARY KEY,
PlayerID integer,
Amount integer,
BidDate text,
User integer
);
INSERT INTO bid VALUES(1,1,1500000,NULL,0);
INSERT INTO bid VALUES(2,2,5875000,0,0);
INSERT INTO bid VALUES(3,1,1500000,'1625513541.2904',505414867524517888);
INSERT INTO bid VALUES(4,1,1500000,'1625513541.33661',840702168863735889);
我已经尝试过不同的查询。但如果我得到最大(数量),我仍然留下日期。 您还将看到我用于测试 Min(NULLIF(BidDate)) 的 Amounts of Null 或 0,但没有帮助。
在这种情况下,我期望(想要实现)的结果是:
BidID | PlayerID | Amount | BidDate | User |
------|----------|----------|-----------------|--------------------|
3 | 1 | 1500000 | 1625513541.2904 | 505414867524517888 |
2 | 2 | 5875000 | 0 or Empty | 0 |
感谢任何建议或帮助。
【问题讨论】:
【参考方案1】:您的要求的棘手部分是在BidDate
列中您有null
s 或0
(尽管您已将列定义为text
)。
使用 ROW_NUMBER()
窗口函数和适当的 ORDER BY
子句,考虑到这些违规行为:
SELECT BidID, PlayerID, Amount, BidDate, User
FROM (
SELECT *, ROW_NUMBER() OVER (
PARTITION BY PlayerID
ORDER BY Amount DESC, COALESCE(BidDate, 0) = 0, BidDate
) rn
FROM bid
)
WHERE rn = 1
请参阅demo。
【讨论】:
谢谢。我检查了你的演示,还告诉我更多关于 ROW_NUMBER 函数的信息,因为我从未接触过或使用过它。我会检查它的应用程序,但它看起来非常好:) @Pierre ROW_NUMBER() 是 SQLite 自 3.25.0 版本以来支持的窗口函数之一,您可以在此处阅读更多信息:sqlitetutorial.net/sqlite-window-functions/sqlite-row_number @Pierre 如果这个答案解决了您的问题,请不要忘记点击复选标记接受它。 这确实是我所指的链接 - 很好的文档。主要使用 mysql - SQLite 对我来说是“新的”。现在将尝试将您的解决方案应用于我的项目,因为它在这里运行良好。以上是关于获取具有最高值的行 - 如果多行采用另一个条件的主要内容,如果未能解决你的问题,请参考以下文章