如何在sqlserver中使用限定的rownumber来过滤数据



我正在尝试使用QUALIFY来过滤数据而不需要访问(在SQL SERVER中(另外,我不想在SELECT语句中创建一个具有row_number的表,然后使用WHERE子句。

select *
from [dbo].[DWH_TicketThread_View]
where 1=1
and threadtype in (313,347,349,385,392,417)
and TicketId = 651353
qualify row_number() over(partition by ticketid order by updatedate desc) = 1

SQL Server不支持出现在其他数据库(如Teradata(中的QUALIFY。以下是使用TOP 1 WITH TIES技巧以类似方式编写查询的一种方法,无需正式的子查询:

SELECT TOP 1 WITH TIES *
FROM [dbo].[DWH_TicketThread_View]
WHERE threadtype IN (313, 347, 349, 385, 392, 417) AND TicketId = 651353
ORDER BY ROW_NUMBER() OVER (PARTITION BY ticketid ORDER BY updatedate DESC);

但上面的内容实际上并没有那么高的性能,所以更典型的情况是,我们实际上会在这里使用一个子查询:

WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY ticketid ORDER BY updatedate DESC) rn
FROM [dbo].[DWH_TicketThread_View]
WHERE threadtype IN (313, 347, 349, 385, 392, 417) AND TicketId = 651353
)
SELECT *
FROM cte
WHERE rn = 1;

最新更新