繁体   English   中英

如何在SQL中找到重复的ROW_NUMBER值,得到最大值的数据集?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM