获取具有最高值的行 - 如果多行采用另一个条件

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 列中您有nulls 或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 对我来说是“新的”。现在将尝试将您的解决方案应用于我的项目,因为它在这里运行良好。

以上是关于获取具有最高值的行 - 如果多行采用另一个条件的主要内容,如果未能解决你的问题,请参考以下文章

如何从没有关系laravel 8的另一个表中检索具有多行的行数据

根据另一列选择具有最高 ID 的行

如果满足一行的条件,则删除多行

Redshift 获取具有最高优先级和时间戳的行

VBA/宏根据多个条件复制随机行

根据列子集删除重复项,保留列 E 中具有最高值的行,如果 E 中的值相等,则列 B 中具有最高值的行