Szukaj…
Dodawanie łącznej liczby wybranych wierszy do każdego wiersza
SELECT your_columns, COUNT(*) OVER() as Ttl_Rows FROM your_data_set
ID | Nazwa | Ttl_Rows |
---|---|---|
1 | przykład | 5 |
2) | bla | 5 |
3) | bar | 5 |
4 | baz | 5 |
5 | quux | 5 |
Zamiast używać dwóch zapytań do uzyskania liczby, a następnie wiersza, możesz użyć agregacji jako funkcji okna i użyć pełnego zestawu wyników jako okna.
Może to być wykorzystane jako podstawa do dalszych obliczeń bez złożoności dodatkowych samodzielnych połączeń.
Konfigurowanie flagi, jeśli inne wiersze mają wspólną właściwość
Powiedzmy, że mam te dane:
Elementy stołu
ID | Nazwa | etykietka |
---|---|---|
1 | przykład | unikalny_tag |
2) | bla | prosty |
42 | bar | prosty |
3) | baz | Witaj |
51 | quux | świat |
Chciałbym uzyskać wszystkie te linie i wiedzieć, czy znacznik jest używany przez inne linie
SELECT id, name, tag, COUNT(*) OVER (PARTITION BY tag) > 1 AS flag FROM items
Wynik będzie:
ID | Nazwa | etykietka | flaga |
---|---|---|---|
1 | przykład | unikalny_tag | fałszywy |
2) | bla | prosty | prawdziwe |
42 | bar | prosty | prawdziwe |
3) | baz | Witaj | fałszywy |
51 | quux | świat | fałszywy |
W przypadku, gdy twoja baza danych nie ma PONAD i PARTYCJI, możesz użyć tego do uzyskania tego samego rezultatu:
SELECT id, name, tag, (SELECT COUNT(tag) FROM items B WHERE tag = A.tag) > 1 AS flag FROM items A
Uzyskiwanie bieżącej sumy
Biorąc pod uwagę te dane:
data | ilość |
---|---|
2016-03-12 | 200 |
2016-03-11 | -50 |
14.03.2016 | 100 |
15.03.2016 | 100 |
2016-03-10 | -250 |
SELECT date, amount, SUM(amount) OVER (ORDER BY date ASC) AS running
FROM operations
ORDER BY date ASC
da tobie
data | ilość | bieganie |
---|---|---|
2016-03-10 | -250 | -250 |
2016-03-11 | -50 | -300 |
2016-03-12 | 200 | -100 |
14.03.2016 | 100 | 0 |
15.03.2016 | 100 | -100 |
Uzyskiwanie N najnowszych wierszy w wielu grupach
Biorąc pod uwagę te dane
Identyfikator użytkownika | Data_kończenia |
---|---|
1 | 2016-07-20 |
1 | 2016-07-21 |
2) | 2016-07-20 |
2) | 2016-07-21 |
2) | 2016-07-22 |
;with CTE as
(SELECT *,
ROW_NUMBER() OVER (PARTITION BY User_ID
ORDER BY Completion_Date DESC) Row_Num
FROM Data)
SELECT * FORM CTE WHERE Row_Num <= n
Przy użyciu n = 1 otrzymasz jeden najnowszy wiersz na user_id
:
Identyfikator użytkownika | Data_kończenia | Row_Num |
---|---|---|
1 | 2016-07-21 | 1 |
2) | 2016-07-22 | 1 |
Znajdowanie rekordów „poza kolejnością” za pomocą funkcji LAG ()
Biorąc pod uwagę te przykładowe dane:
ID | STATUS | STATUS_TIME | STATUS_BY |
---|---|---|---|
1 | JEDEN | 28.09.2016, 19.47.52.501398 | USER_1 |
3) | JEDEN | 2016-09-28-19.47.52.501511 | USER_2 |
1 | TRZY | 28.09.2016, 19.47.52.501517 | USER_3 |
3) | DWA | 28.09.2016, 19.47.52.501521 | USER_2 |
3) | TRZY | 28.09.2016, 19.47.52.501524 | USER_4 |
Elementy identyfikowane za pomocą wartości ID
muszą przechodzić kolejno ze STATUS
„JEDEN” do „DWÓCH” do „TRZY”, bez pomijania stanów. Problem polega na znalezieniu wartości użytkowników ( STATUS_BY
), którzy naruszają regułę i natychmiast przechodzą z „JEDNEGO” na „TRZY”.
Funkcja analityczna LAG()
pomaga rozwiązać problem, zwracając dla każdego wiersza wartość z poprzedniego wiersza:
SELECT * FROM (
SELECT
t.*,
LAG(status) OVER (PARTITION BY id ORDER BY status_time) AS prev_status
FROM test t
) t1 WHERE status = 'THREE' AND prev_status != 'TWO'
Jeśli twoja baza danych nie ma LAG (), możesz użyć tego do uzyskania tego samego rezultatu:
SELECT A.id, A.status, B.status as prev_status, A.status_time, B.status_time as prev_status_time
FROM Data A, Data B
WHERE A.id = B.id
AND B.status_time = (SELECT MAX(status_time) FROM Data where status_time < A.status_time and id = A.id)
AND A.status = 'THREE' AND NOT B.status = 'TWO'