Όλες οι συνηθισμένες συναρτήσεις παραθύρου της SQL και οι ρήτρες που τις ελέγχουν, ομαδοποιημένες ανά εργασία: κατάταξη γραμμών, ματιά στους γείτονες, εκτελούμενα αθροίσματα πάνω σε ένα πλαίσιο και λήψη πρώτων ή τελευταίων τιμών. Κάθε γραμμή συνδυάζει τη συνάρτηση με ένα παράδειγμα μίας γραμμής.
Μια συνάρτηση παραθύρου υπολογίζει ένα αποτέλεσμα σε γραμμές που σχετίζονται με την τρέχουσα γραμμή, χωρίς να τις συνενώνει όπως κάνει το GROUP BY. Κάθε συνάρτηση παραθύρου τελειώνει σε μια ρήτρα OVER που ορίζει το παράθυρο: το PARTITION BY ομαδοποιεί τις γραμμές, το ORDER BY τις ταξινομεί και το προαιρετικό πλαίσιο περιορίζει το συρόμενο σύνολο. Κατακτήστε το OVER και τα υπόλοιπα είναι λεξιλόγιο.
Πίνακας αναφοράς · 27 καταχωρήσεις
Συναρτήσεις παραθύρου SQLExplained
27 of 27 rows
Κατάταξη
Ένας μοναδικός διαδοχικός ακέραιος ανά γραμμή μέσα στο παράθυρο.
ROW_NUMBER() OVER (ORDER BY total DESC)
Κατάταξη με κενά· οι ισοβαθμίες μοιράζονται μια θέση και παραλείπονται οι επόμενοι αριθμοί.
RANK() OVER (ORDER BY total DESC)
Κατάταξη χωρίς κενά· οι ισοβαθμίες μοιράζονται μια θέση και δεν παραλείπεται τίποτα.
DENSE_RANK() OVER (ORDER BY total DESC)
Διαιρεί το ταξινομημένο παράθυρο σε n περίπου ίσα κομμάτια.
NTILE(4) OVER (ORDER BY total DESC)
Ματιά στους γείτονες
Μια τιμή από n γραμμές πίσω· η προεπιλεγμένη τιμή την αντικαθιστά όταν δεν υπάρχει τέτοια γραμμή.
LAG(total, 1, 0) OVER (ORDER BY created_at)
Μια τιμή από n γραμμές μπροστά· η προεπιλεγμένη τιμή την αντικαθιστά όταν δεν υπάρχει τέτοια γραμμή.
LEAD(total, 1, 0) OVER (ORDER BY created_at)
Συνάθροιση πάνω σε παράθυρο
Εκτελούμενο ή ανά κατάτμηση άθροισμα χωρίς συνένωση γραμμών.
SUM(total) OVER (ORDER BY created_at)
Εκτελούμενος ή ανά κατάτμηση μέσος όρος.
AVG(total) OVER (PARTITION BY user_id)
Εκτελούμενος ή ανά κατάτμηση αριθμός γραμμών.
COUNT(*) OVER (PARTITION BY user_id)
Η χαμηλότερη τιμή σε όλο το παράθυρο ή την κατάτμηση.
MIN(total) OVER (PARTITION BY user_id)
Η υψηλότερη τιμή σε όλο το παράθυρο ή την κατάτμηση.
MAX(total) OVER (PARTITION BY user_id)
SUM με ORDER BY και πλαίσιο ανοιχτό από την αρχή· κάθε γραμμή αθροίζει τα πάντα μέχρι τον εαυτό της.
SUM(total) OVER (ORDER BY created_at ROWS UNBOUNDED PRECEDING)
Μέσος όρος πάνω σε πλαίσιο από n γραμμές πριν και μετά την τρέχουσα γραμμή.
AVG(total) OVER (ORDER BY created_at ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING)
Πρώτες, τελευταίες και εκατοστημόρια
Η πρώτη τιμή στην ταξινόμηση του παραθύρου.
FIRST_VALUE(total) OVER (ORDER BY total DESC)
Η τελευταία τιμή στο πλαίσιο· χωρίς UNBOUNDED FOLLOWING το πλαίσιο σταματά στην τρέχουσα γραμμή.
LAST_VALUE(total) OVER (ORDER BY total ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
Η τιμή στην n-οστή γραμμή της ταξινόμησης του παραθύρου.
NTH_VALUE(total, 2) OVER (ORDER BY total DESC)
Η σχετική θέση μιας γραμμής, από 0 έως 1.
PERCENT_RANK() OVER (ORDER BY total)
Το μερίδιο των γραμμών έως και την τρέχουσα γραμμή, από 1/n έως 1.
CUME_DIST() OVER (ORDER BY total)
Η ρήτρα OVER
Ορίζει το παράθυρο που διαβάζει κάθε συνάρτηση.
<fn>() OVER (PARTITION BY user_id ORDER BY created_at)
Επανεκκινεί το παράθυρο για κάθε ομάδα γραμμών.
PARTITION BY user_id
Ταξινομεί τις γραμμές μέσα σε κάθε κατάτμηση.
ORDER BY created_at
Περιορίζει το συρόμενο πλαίσιο, π.χ. από προηγούμενες σε επόμενες γραμμές.
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
Περιορίζει το πλαίσιο κατά τιμές, όχι κατά θέσεις γραμμών· το CURRENT ROW περιλαμβάνει τις ισοβαθμίες, και αυτό είναι το προεπιλεγμένο πλαίσιο με ORDER BY.
RANGE BETWEEN 100 PRECEDING AND CURRENT ROW
Περιορίζει το πλαίσιο κατά ομάδες ισόβαθμων γραμμών από το ORDER BY.
GROUPS BETWEEN 1 PRECEDING AND CURRENT ROW
Αφαιρεί την τρέχουσα γραμμή από το πλαίσιο· το EXCLUDE TIES αφαιρεί αντ' αυτού τις ισοβαθμίες της.
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW
Ονομάζει ένα παράθυρο μία φορά ανά ερώτημα, ώστε πολλές ρήτρες OVER να μπορούν να το επαναχρησιμοποιούν.
WINDOW w AS (PARTITION BY user_id ORDER BY created_at)
Στενεύει τις γραμμές που διαβάζει μια συνάρτηση συνάθροισης, πριν εφαρμοστεί το παράθυρο.
SUM(total) FILTER (WHERE status = 'paid') OVER (ORDER BY created_at)