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'


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow