2017-02-22 5 views
1

У меня есть два запроса, почти аналогичные:Влияние QUALIFY SUM (1) НАРУШЕНИЕ (РАЗРЕШЕНИЕ ПО БЕЗОПАСНОМУ ПРЕОБРАЗОВАНИЮ) = 1?

SELECT * 
FROM table 
QUALIFY SUM(1) OVER (PARTITION BY id_field ROWS UNBOUNDED PRECEDING) = 1; 

и

SELECT * 
FROM table 
QUALIFY SUM(1) OVER (PARTITION BY id_field) = 1; 

Я не могу понять, почему на ROWS UNBOUNDED PRECEDING имеет никакого влияния на запросы.

Для меня казалось бы, что оба запроса дадут тот же результат, поскольку функция SUM не использует какой-либо столбец моей таблицы, и поэтому ROWS UNBOUNDED PRECEDING не повлияет на SUM.

Но на самом деле первый запрос дает больше строк в результате второго, когда я его выполняю.

В чем разница между двумя запросами, и каков эффект ROWS UNBOUNDED PRECEDING для данного QUALIFY?

+0

Что вы на самом деле пытаетесь сделать? – Andrew

+0

'ROWS UNBOUNDED PRECEDING' без' order by'? –

+0

Я пытаюсь получить одну строку для каждого отдельного id_field, основываясь на самой последней дате другого столбца. В исходном запросе был поле ORDER BY по дате, но я удалил его в вопросе, чтобы сосредоточиться на том, почему количество строк в результатах моих запросов отличается. – user20085

ответ

1

Первый запрос возвращает первую строку каждого раздела.
У этого есть «общая сумма» логики.
Сумма для 1-го ряда будет 1, для 2-го - 2, 3-го - 3 и т. Д.

2-й запрос возвращает строки из разделов, имеющих только одну строку.


Это даст вам последнюю запись каждого id_field

SELECT * 
FROM  table 
QUALIFY row_number() OVER (PARTITION BY id_field order by ... desc) = 1 
; 
Смежные вопросы