【问题标题】:Selecting only row with highest number from ROW_NUM to get the latest update从 ROW_NUM 中仅选择编号最大的行以获取最新更新
【发布时间】: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:因为一条记录可以在同一天多次更新,但只有最后一行编号反映了最新更新。

【问题讨论】:

    标签: sql tsql


    【解决方案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])...
    猜你喜欢
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 2022-01-08
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多