Jak zliczyc total rekordów do danej daty? SELF JOIN?

0

Hej,
Mam 1 tabelę z jedną kolumna o nazwie Data. W tabeli mamy datę otrzymania listu. Zadanie polega na wygenerowaniu tabeli jak poniżej:

date | count | total
-----------+-------+-------
2017-01-26 | 20 | 20
2017-01-27 | 17 | 37

gdzie:

  1. TOTAL ma oznaczać liczbę WSZYSTKICH listów otrzymanych do danej daty, np w rekordzie pierwszym do daty 2017-01-26
  2. COUNT liczba listów zarejestrowanych w danych dniu np. 2017-01-26
    Prośba o info jak otrzymać kolumnę TOTAL, z Count sobie poradziłam :) Podjęłam kilka prób, (myslę, że to powinno byc zrobione przy pomocy SELF JOIN) ale nie wyszło :/ Z góry dziekuję za pomoc!
1

Poczytaj o funkcjach okna (o ile Twój silnik bazy danych je wspiera).

1

Funkcje analityczne byłyby moim pierwszym wyborem: COUNT(0) OVER (PARTITION BY ....) , ale silnik musi to wspierać.

Self joinem kombinowałbym tak:

with helper as (
  select 
    t.data,
    case 
       when t.data=s.data then 1 
       else 0 
    end total_flag 
  from 
    tabelka t join tabelka s on t.data<=s.data)
select 
	t.data, 
	sum(total_flag), 
	count(0) total
from 
	helper 
grlup by 
	t.data 
order by t.data;
  • Dla każdego rekordu doklejamy rekordy z tej samej tabeli o ile data <= daty w "bieżącym rekordzie".
  • Robimy kolumnę pomocniczą (total_flag), która mówi nam czy data jest taka sama jak w danym dniu (wartość 1, czy inna, wartość 0) i sumujemy.
  • Agregujemy dane z tabelki pomocniczej.
0

Dzięki za odp. prześledzę jeszcze ta funkcję z SELF JOIN.
Przeczytałam o funkcji OVER (dzięki za trop) , ale pojawił sie jeszcze jeden problem, kolumna w tabeli nazywa się dokładnie created_at, i jest datą wraz z godziną, a ma zwrócic jedynie datę:
Napisałam nastepujące zapytanie:
SELECT
DATE(created_at) as date,
COUNT(DATE(created_at)) AS count,
COUNT(created_at) OVER(ORDER BY DATE(created_at)) as total
FROM posts
GROUP BY created_at
ORDER BY date;

W wyniku kolumna TOTAL jest poprawna, ale date i count już nie, bo nie grupuje po dacie:
....date.... ...I..count..I....total....I
2017-01-26 I...1...... I......3...... I
2017-01-26 I...1...... I......3.......I
2017-01-26 I...1...... I......3.......I
2017-01-27 I...1...... I......5.......I
2017-01-27 I...1...... I......5.......I

Macie może pomysł jak pogrupować to według daty bez godziny? Kombinowałam z SELECT DISTINCT, ale wynik w kolumnie count nadal błędny. Wybaczcie, ale jestem poczatkująca, więc pewne rzeczy o które pytam być może są oczywiste dla Was :)

0

Można użyć jakiegoś cte albo podtabeli.

0

Wiem jak to zrobić w MySql oraz w Oracle, tego SQL'a nie rozpoznaje, jak powiesz to może wymodzę tłumaczenie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1