Sql 从row_NUM中仅选择编号最高的行以获取最新更新
我还在学习SQL。目前,我能够从分区和row_number()中获取行号 然而,我被困在一个我想不出方法来选择最高的行数以便只查看最新更新的记录的地方 我在末尾得到了无效的列名。我为混乱的结构道歉,我计划把它清理得更好 提前感谢你们的回答/提示。谢谢你抽出时间 编辑:最新更新实际上是返回的行数最高,而不是1。我忘了具体说明Sql 从row_NUM中仅选择编号最高的行以获取最新更新,sql,tsql,Sql,Tsql,我还在学习SQL。目前,我能够从分区和row_number()中获取行号 然而,我被困在一个我想不出方法来选择最高的行数以便只查看最新更新的记录的地方 我在末尾得到了无效的列名。我为混乱的结构道歉,我计划把它清理得更好 提前感谢你们的回答/提示。谢谢你抽出时间 编辑:最新更新实际上是返回的行数最高,而不是1。我忘了具体说明 FROM ( SELECT a.DELFLAG, a.fname, a.lname,
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:因为一条记录可以在同一天更新多次,但只有最后一行号反映了最新的更新
这是您的代码:
WHERE
[row_num] = SELECT MAX([row_num]) AS latest)
很可能,您想要:
WHERE
[row_num] = 1
理由:row\u number()
对分区内的记录进行排序;在代码中,它为每个(键1,键2)
元组分配秩1
,并使用maxl.update
。这些是你想要保留的记录,所以。。。只需按[row\u num]=1进行筛选即可
另一方面,如果您想要每个分区的最早记录,则在window函数的order by
子句中使用升序排序,而不是降序排序:
ROW_NUMBER() OVER(PARTITION BY key1, key2 ORDER BY l.lupdate) as row_num
外部查询仍然会过滤行数=1
您可以只使用count()
然后在where
子句中使用它来计算最大行数:
COUNT(*) OVER (PARTITION BY key1, key2) AS cnt
然后:
WHERE cnt = row_num
这假设您希望每对key1
/key2
一行。哎呀,很抱歉没有彻底解释结构。最新更新实际上是最大的行数,而不是1。。。。谢谢你的解释和理由。虽然这有助于我进一步理解,但我做了一个编辑2来进一步解释为什么它在我的案例中不起作用。希望我已经详细地解释了我的情况。@SabreTheCat:哪一行得到最后一个行号是由窗口函数的orderby
子句定义的。您只需选择排序方向(orderbyl.update[asc/desc]
),将感兴趣的行放在第一位……非常感谢您的帮助!这是我所需要的,非常感谢你的帮助!