我可以从比较Column2和Column2的表中选择*吗?

时间:2019-02-26 00:54:39

标签: sql-server tsql

表格示例

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号将重复执行,直到批次完成为止,然后将为下一个批次记录一个新的编号。在此示例中,我只想返回最后两行,但是行数在很大程度上取决于记录数。

我想返回Column2中所有具有1111-1的行。可能有<或> 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

4 个答案:

答案 0 :(得分:0)

欢迎内森。

我建议您利用ROW_NUMBER()窗口函数,该函数可通过更改列中的值并按另一列中的值排序来对行进行分段:

SELECT ic.Column1, ic.Column2
  FROM (SELECT Column1, 
               Column2, 
               rowNum = ROW_NUMBER() OVER (PARTITION BY Column2 ORDER BY Column1 DESC)
          FROM YourTable) ic
 WHERE ic.rowNum <= 2

内部查询将返回:

Column1(datetime)       Column2(varchar)    rowNum(int)
2-22-2022 1:11:11       1234                2
2-22-2022 1:12:11       1234                1
2-22-2022 1:13:11       4321                2
2-22-2022 1:14:11       4321                1

如果Column2中的值存在更多行,则较早的行将获得HIGHER rowNum值(由于ORDER BY ... DESC)。

通过使用WHERE ic.rowNum <= 2,外部查询将只为Column2中的每个值呈现最后两行。

答案 1 :(得分:0)

SELECT
   Col1,
   Col2
FROM
Table 
GROUP BY Col1,Col2
ORDER By Col1 DESC

您可以将Count(*)作为Volume进行计算,以查看每个批次有多少次迭代。

答案 2 :(得分:0)

如果需要获取每个批次的最后两行,则可以使用:

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

另外,如果需要获取具有相同值的行,则可以使用density_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

答案 3 :(得分:0)

我认为过多强调尝试计算其他答案中的行数。到底有多少行并不重要。原始请求指定他要从满足条件的特定表中获取所有记录。首先,他需要确定最新记录的Column1值,该值可以使用:

选择最大值(第1列) 从表中

然后他可以使用以下方法获取该记录的column2的值:

选择列2 从表 其中Column1 =(从表中选择max(Column1))

现在将所有内容放在一起以获取表中Column2包含最新记录的相同值的所有记录,请使用:

选择* 从表 其中Column2 =(从表中选择Column2,而Column1 =(从表中选择max(column1)))