[英]How can I find the repeating ROW_NUMBER value in SQL and get the data set with the highest value?
我在 SQL 中按查询结果分组的数据集。此数据具有 ROW_NUMBER 值。 在这里,如果 ROW_NUMBER 值按顺序排列,我想获得最高的 ROW_NUMBER 值。 我怎样才能做到这一点。 我的 SQL 查询是这样的。
SELECT [_NAME]
,[LINE]
,[TIMESTAMP]
,[Equipment]
,[CL_Name]
,[Status]
,[ROW_NUMBER]
FROM [dbo].[Deflection]
where [TIMESTAMP] > DATEADD(day,-1,GETDATE()) and [Status] = 0
group by [CL_Name], [Equipment], [_NAME], [LINE], [TIMESTAMP], [Status], [ROW_NUMBER]
order by [ROW_NUMBER] desc, [TIMESTAMP] desc
查询的output如下:
_名称 | 线 | 时间戳 | 设备 | CL_名称 | 地位 | 行_NUMBER |
---|---|---|---|---|---|---|
01包 | 2个 | 2023-01-04 16:45:35.673 | 盒 | 一种 | 0 | 288 |
01包 | 2个 | 2023-01-04 16:50:35.673 | 盒 | 一种 | 0 | 287 |
01包 | 2个 | 2023-01-04 16:55:35.673 | 盒 | 一种 | 0 | 286 |
02包 | 3个 | 2023-01-04 23:20:36.063 | 盒 | 乙 | 0 | 209 |
03包 | 4个 | 2023-01-04 23:20:36.063 | 盒 | C | 0 | 209 |
03包 | 4个 | 2023-01-04 23:25:36.067 | 盒 | C | 0 | 208 |
03包 | 4个 | 2023-01-04 23:30:36.073 | 盒 | C | 0 | 207 |
03包 | 4个 | 2023-01-04 23:35:36.077 | 盒 | C | 0 | 206 |
01包 | 2个 | 2023-01-04 23:45:36.067 | 盒 | 一种 | 0 | 206 |
01包 | 2个 | 2023-01-04 23:50:36.073 | 盒 | 一种 | 0 | 205 |
01包 | 2个 | 2023-01-04 23:55:36.077 | 盒 | 一种 | 0 | 204 |
在这里,如果 ROW_NUMBER 按连续顺序连续,我希望具有相同 CL_Name 的值获得最大的 ROW_NUMBER 值,我不希望它们取其他值。 所以我希望正确表的output是这样的。
_名称 | 线 | 时间戳 | 设备 | CL_名称 | 地位 | 行_NUMBER |
---|---|---|---|---|---|---|
01包 | 2个 | 2023-01-04 16:45:35.673 | 盒 | 一种 | 0 | 288 |
02包 | 3个 | 2023-01-04 23:20:36.063 | 盒 | 乙 | 0 | 209 |
03包 | 4个 | 2023-01-04 23:20:36.063 | 盒 | C | 0 | 209 |
01包 | 2个 | 2023-01-04 23:45:36.067 | 盒 | 一种 | 0 | 206 |
我想得到这样的 output,但我做不到。 我怎样才能做到这一点?
您可以为每个组按降序创建一个新的行号rn
,然后为每个组选择 #1。 例如:
select x.*,
row_number() over(partition by cl_name order by [ROW_NUMBER] desc) as rn
from (
-- your query here
) x
where rn = 1
你在这里有一个差距和孤岛问题,你可以使用两个 row_number 函数之间的差异来解决它,如下所示:
Select Top 1 With Ties
_NAME, LINE, TIMESTAMP, Equipment, CL_Name, Status, [ROW_NUMBER]
From
(
Select *,
ROW_NUMBER() Over (Order By TIMESTAMP) -
ROW_NUMBER() Over (Partition By _NAME Order By TIMESTAMP) As grp
From table_name
) T
Order By ROW_NUMBER() Over (Partition By _NAME, grp Order By [ROW_NUMBER] Desc)
这相当于以下内容:
With create_groups AS
(
Select *,
ROW_NUMBER() Over (Order By TIMESTAMP) -
ROW_NUMBER() Over (Partition By _NAME Order By TIMESTAMP) As grp
From table_name
),
max_row_num AS
(
Select *,
ROW_NUMBER() Over (Partition By _NAME, grp Order By [ROW_NUMBER] Desc) As rn
From create_groups
)
Select _NAME, LINE, TIMESTAMP, Equipment, CL_Name, Status, [ROW_NUMBER]
From max_row_num
Where rn = 1
Order By _NAME, TIMESTAMP
我会 go 与:
SELECT CL_Name,
MAX(ROW_NUMBER)
FROM [dbo].[Deflection]
GROUP BY ROW_NUMBER
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.