从 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 中仅选择编号最大的行以获取最新更新的主要内容,如果未能解决你的问题,请参考以下文章