Как фильтровать данные, используя квалифицированный row_number на сервере sql

Я пытаюсь использовать 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

Отвечает ли это на ваш вопрос? QUALIFY-подобная функция в SQL Server

Equinox 10.12.2020 09:49

Этот вопрос мне совершенно ясен, и я не понимаю, почему он был закрыт по приведенной выше причине.

Tim Biegeleisen 10.12.2020 09:52

Я не мог не согласиться. ответ хорошо написан и понятен даже для аудитории с базовым пониманием. Тим спасибо за решение моего вопроса.

Eyal Marom 10.12.2020 09:55
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
3
2 415
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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;

Другие вопросы по теме