表格示例
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
答案 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)))