首页 > 解决方案 > 我可以从将 Column2 与(Column2 与 Column1 中的最新时间戳)进行比较的表中选择 * 吗?

问题描述

表格示例

Column1 (datetime)      Column2 (varchar)
-----------------------------------------
2-22-2022 1:11:11       1234-1
2-22-2022 1:12:11       1234-1
2-22-2022 1:13:11       4321-1
2-22-2022 1:14:11       4321-1
2-23-2022 7:00:00       4321-1
2-23-2022 7:02:00       4321-1
2-23-2022 7:04:00       4321-1
2-23-2022 7:10:00       1111-1
2-23-2022 7:11:00       1111-1
2-23-2022 7:12:00       1111-1
2-23-2022 7:13:00       1111-1

我正在记录过程数据。该Column2编号将重复直到批次完成,然后将记录下一个批次的新编号。我只想在此示例中返回最后两行,但行数可能取决于记录数。

我想返回 1111-1 中的所有行Column2。可能有 < 或 > 4 条记录。

期望的结果

Column1 (datetime)      Column2 (varchar)    
-----------------------------------------
2-23-2022 7:10:00       1111-1
2-23-2022 7:11:00       1111-1
2-23-2022 7:12:00       1111-1
2-23-2022 7:13:00       1111-1

标签: sql-servertsql

解决方案


如果您需要获取每批的最后两行,那么您可以使用:

with cte as
 (SELECT Column1, Column2, 
  rowNum = ROW_NUMBER() OVER (PARTITION BY Column2 ORDER BY Column1 DESC)
  FROM Table)
 select Column1, Column2
 from cte
 where rowNum in (1, 2)
 order by Column1 desc

如果您需要获取已插入表中的最后两行,则可以使用:

SELECT TOP 2 Column1, Column2, 
      rowNum = ROW_NUMBER() OVER (PARTITION BY Column2 ORDER BY Column1 DESC)
      FROM Table
ORDER BY Column1 desc

此外,如果您需要获取具有相同值的行,那么您可以使用 dense_rank() 而不是 row_number():

SELECT TOP 2 Column1, Column2, 
          rowNum = dense_rank() OVER (PARTITION BY Column2 ORDER BY Column1 DESC)
          FROM Table
    ORDER BY Column1 desc

推荐阅读