Я пытаюсь использовать QUALIFY для фильтрации данных без безопасности (в SQL SERVER) Кроме того, я не хочу создавать таблицу с row_number в операторе SELECT, а затем использовать предложение 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 не поддерживает QUALIFY
, который появляется в других базах данных, таких как Teradata. Вот один из способов написать запрос аналогичным образом, без формального подзапроса, используя трюк 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-подобная функция в SQL Server