【问题标题】:How can I find the repeating ROW_NUMBER value in SQL and get the data set with the highest value? [duplicate]SQL中如何找到重复的ROW_NUMBER值,并得到值最大的数据集? [复制]
【发布时间】:2023-01-05 23:26:31
【问题描述】:

我有按 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

查询的输出如下:

_NAME LINE TIMESTAMP Equipment CL_Name Status ROW_NUMBER
01Pack 2 2023-01-04 16:45:35.673 Pack A 0 288
01Pack 2 2023-01-04 16:50:35.673 Pack A 0 287
01Pack 2 2023-01-04 16:55:35.673 Pack A 0 286
02Pack 3 2023-01-04 23:20:36.063 Pack B 0 209
03Pack 4 2023-01-04 23:20:36.063 Pack C 0 209
03Pack 4 2023-01-04 23:25:36.067 Pack C 0 208
03Pack 4 2023-01-04 23:30:36.073 Pack C 0 207
03Pack 4 2023-01-04 23:35:36.077 Pack C 0 206
01Pack 2 2023-01-04 23:45:36.067 Pack A 0 206
01Pack 2 2023-01-04 23:50:36.073 Pack A 0 205
01Pack 2 2023-01-04 23:55:36.077 Pack A 0 204

在这里,如果 ROW_NUMBER 按连续顺序连续,我希望具有相同 CL_Name 的值获得最大的 ROW_NUMBER 值,我不希望它们取其他值。所以我希望正确表的输出是这样的。

_NAME LINE TIMESTAMP Equipment CL_Name Status ROW_NUMBER
01Pack 2 2023-01-04 16:45:35.673 Pack A 0 288
02Pack 3 2023-01-04 23:20:36.063 Pack B 0 209
03Pack 4 2023-01-04 23:20:36.063 Pack C 0 209
01Pack 2 2023-01-04 23:45:36.067 Pack A 0 206

我想得到这样的输出,但我做不到。我怎样才能做到这一点?

【问题讨论】:

  • 仅供参考,timestamp 通常不是 SQL Server 中列名的糟糕选择。 timestamprowversion 的已弃用同义词,它是一个 binary(8) 值,并且具有没有与日期和时间值有关。
  • 如果 ROW_NUMBER 值才不是输入顺序值,输出应该是什么?
  • @ahmed 这里 ROW_NUMBER 总是按顺序排列。例如,因为我得到一个每日数据,它从 ROW_NUMBER = 288 开始,上升到 ROW_NUMBER =1。在这里,我的主要目的是每 5 分钟在 Status = 0 的数据中写入数据。查找具有 TIMESTAMP 值的数据,其中相同的重复 CL_Name 数据首先开始。所以得到最高的重复 ROW_NUMBER
  • 然后考虑@The Impaler 的回答,说起来令人困惑如果 ROW_NUMBER 值进入顺序值虽然它总是按顺序进行。
  • @ahmed 我更新了我的问题。 Impaler 的回答不太符合我的要求。如果我那样做,它会根据单个 CL_Name 状态获取数据,并将其分组。其实,这不是我想要的。您可以在我编辑的问题中看到它。

标签: sql sql-server tsql


【解决方案1】:

您可以按降序为每个组创建一个新行号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

【讨论】:

  • 我们真的需要吗其他Get top 1 row of each group 的副本?
  • @Larnu 你是对的。请将其标记为重复。
  • @TheImpaler 我试过你的回答,但我又更新了我的问题,抱歉我写错了。根据您的回答,它实际上按单个 CL_Name 分组。但我不想那样。我想根据不同时间出现的同一个 CL_Name 捕获 Status = 0 的第一个数据。无需将其缩减为单个 CL_Name 数据。在我更新的问题中,相同的数据集可以在不同的时间出现。我想分别评估它们。
  • @Larnu 我能问你点事吗?
【解决方案2】:

我会选择:

SELECT CL_Name,
       MAX(ROW_NUMBER)
FROM [dbo].[Deflection]
GROUP BY ROW_NUMBER

【讨论】:

  • 这将产生一个错误。
猜你喜欢
  • 2020-01-04
  • 2021-12-02
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2018-08-22
  • 2020-07-25
相关资源
最近更新 更多