如何在 sql 服务器中使用限定 row_number 过滤数据
how to filter data using qualify row_number in sql server
我正在尝试使用 QUALIFY 过滤数据而无需 seccess(在 SQL 服务器中)
另外,我不想在 SELECT 语句中使用 row_number 创建 table 然后使用 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服务器不支持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;
我正在尝试使用 QUALIFY 过滤数据而无需 seccess(在 SQL 服务器中) 另外,我不想在 SELECT 语句中使用 row_number 创建 table 然后使用 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服务器不支持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;