从 ROW_NUM 中仅选择编号最大的行以获取最新更新

Posted

技术标签:

【中文标题】从 ROW_NUM 中仅选择编号最大的行以获取最新更新【英文标题】:Selecting only row with highest number from ROW_NUM to get the latest update 【发布时间】:2020-09-22 20:10:28 【问题描述】:

我还在学习 SQL。目前,我能够从分区和 row_number() 中获取行号

但是,我想不出一种方法来选择最高的 row_num 以便仅查看具有最新更新的记录。

最后我得到无效的列名。我为混乱的结构道歉,我打算把它清理得更好。

提前感谢你们的任何回答/提示。感谢您的宝贵时间。

编辑:最新的更新实际上是最高的row_num返回而不是1。我忘了指定。

FROM
        (
        SELECT
        a.DELFLAG,
        a.fname, 
        a.lname, 
        a.key1, 
        l.key2,
        l.update,
        ROW_NUMBER() OVER(PARTITION BY key1, key2 ORDER BY l.lupdate DESC) AS row_num 

FROM dbo.t1 a
    
    INNER JOIN dbo.t2 i ON i.key1 = a.key1
    INNER JOIN dbo.t3 l ON l.key1 = i.key1
    ) AS K  

WHERE 
    [row_num] = SELECT MAX([row_num]) AS latest)
    AND
    DELFLAG = 0 

编辑 2:因为一条记录可以在同一天多次更新,但只有最后一行编号反映了最新更新。

【问题讨论】:

【参考方案1】:

您可以通过使用count() 然后在where 子句中使用它来计算最大行数:

   COUNT(*) OVER (PARTITION BY key1, key2) AS cnt

然后:

WHERE cnt = row_num

这假设您希望每对 key1/key2 有一行。

【讨论】:

这最终完美地满足了我的需要,非常感谢您的帮助!【参考方案2】:

这是你的代码:

WHERE 
    [row_num] = SELECT MAX([row_num]) AS latest)

很可能,你想要:

WHERE 
    [row_num] = 1

基本原理:row_number()ranks 分区内的记录;在您的代码中,它将排名1 分配给每个(key1, key2) 元组的最大l.update 记录。这些是您要保留的记录,所以...只需过滤 [row_num] = 1

另一方面,如果您想要每个分区的最早记录,则在窗口函数的order by 子句中使用升序排序而不是降序排序:

ROW_NUMBER() OVER(PARTITION BY key1, key2 ORDER BY l.lupdate) as row_num

外部查询仍然过滤row_num = 1

【讨论】:

哎呀,我很抱歉没有彻底解释结构。最新的更新其实是最大的row_num而不是1....谢谢 非常感谢您的解释和理由。虽然它有助于我进一步理解,但我进行了编辑 2 以进一步解释为什么它在我的情况下不起作用。希望我已经彻底解释了我的情况。 @SabreTheCat: 哪一行获得last 行号由窗口函数的order by 子句定义。您所要做的就是选择将有趣的行放在首位的排序方向 (order by l.update [asc/desc])...

以上是关于从 ROW_NUM 中仅选择编号最大的行以获取最新更新的主要内容,如果未能解决你的问题,请参考以下文章

获取 Microsoft Access 中的行以引用其他行

SQL选择具有最大和最小日期的行

如何选择每个项目具有最大时间戳的行集?

选择字符串中子串最长的行

如何在Objective C的表视图中仅显示具有内容的表行

以编程方式编写 TFS 命令行以获取最新版本、签出和签入