funzioni finestrato sono definite nelle specifiche ANSI per eseguire logicamente dopo l'elaborazione di GROUP BY
, HAVING
, WHERE
.
Per essere più specifici sono ammessi ai passaggi 5.1 e 6 nello Logical Query Processing flow chart here.
suppongo che avrebbe potuto definire in un altro modo e ha permesso GROUP BY
, WHERE
, HAVING
utilizzare le funzioni della finestra con la finestra è il risultato logico impostato all'inizio di quella fase, ma supponiamo che avevano e ci hanno permesso di creare query tali come
SELECT a,
b,
NTILE(2) OVER (PARTITION BY a ORDER BY b) AS NtileForSelect
FROM YourTable
WHERE NTILE(2) OVER (PARTITION BY a ORDER BY b) > 1
GROUP BY a,
b,
NTILE(2) OVER (PARTITION BY a ORDER BY b)
HAVING NTILE(2) OVER (PARTITION BY a ORDER BY b) = 1
Con quattro diverse finestre logici in gioco buona fortuna lavorare fuori ciò che il risultato di questo sarebbe! Inoltre, cosa succede se nello HAVING
si desidera effettivamente filtrare in base all'espressione dal livello GROUP BY
anziché utilizzare la finestra di righe come risultato dopo lo GROUP BY
?
La versione CTE è più dettagliata ma anche più esplicita e più facile da seguire.
WITH T1 AS
(
SELECT a,
b,
NTILE(2) OVER (PARTITION BY a ORDER BY b) AS NtileForWhere
FROM YourTable
), T2 AS
(
SELECT a,
b,
NTILE(2) OVER (PARTITION BY a ORDER BY b) AS NtileForGroupBy
FROM T1
WHERE NtileForWhere > 1
), T3 AS
(
SELECT a,
b,
NtileForGroupBy,
NTILE(2) OVER (PARTITION BY a ORDER BY b) AS NtileForHaving
FROM T2
GROUP BY a,b, NtileForGroupBy
)
SELECT a,
b,
NTILE(2) OVER (PARTITION BY a ORDER BY b) AS NtileForSelect
FROM T3
WHERE NtileForHaving = 1
Mentre questi sono tutti definiti nella dichiarazione SELECT
e hanno alias è facilmente realizzabile per disambiguare risultati da diversi livelli esempio semplicemente passando da WHERE NtileForHaving = 1
a NtileForGroupBy = 1
Qual è il punto di raggruppamento con un 'row_number()'? Ogni oggetto sarà in un gruppo da solo. La domanda è abbastanza legittima, però. – dasblinkenlight
le cose è da considerare se ho una fattura doppia, in tal caso vorrei tenerlo anche questo. Puoi pensare allora perché dovrei raggruppare. il fatto è che voglio perché è così? Perché non possiamo usare le funzioni con finestra in gruppo da? – Mari
come creerà ambiguità. Puoi spiegare? Nel caso in cui voglio solo selezionare il valore di classifica 2 nella clausola where. Hw creerà ambiguità – Mari