2016-03-20 16 views
0

ich eine Tabelle mit der folgenden Struktur: -Anzahl der Einträge zwischen Daten

day,  id 
2016-03-13, 123 
2016-03-13, 123 
2016-03-13, 231 
2016-03-14, 231 
2016-03-14, 231 
2016-03-15, 129 

Und ich möchte einen Tisch bauen, die wie folgt aussieht: -

id, d1, d7, d14 
123, 1, 1, 1 
231, 1, 2, 2 
129, 1, 1, 1 

Im Wesentlichen gegeben für eine id, listet die Anzahl der Tage auf, die einen Eintrag innerhalb eines Zeitfensters haben. Also, wenn ID 123 10 Einträge innerhalb der letzten 14 Tage hat - d14 10.

Bisher würde ich habe: -

SELECT 
     day, 
     id 
    FROM 
     events 
    WHERE 
     datediff (DAY, day, getdate()) <= 7 
    GROUP BY 
     day, 
     id 
+0

Was sind diese "letzten 14 Tage"? Von heute? –

+0

@LukasEder Yup, aktualisiert die Frage, um das mit 'getdate()' –

Antwort

1

Diese Abfrage tun:

SELECT 
    id, 
    COUNT(DISTINCT CASE WHEN current_date - day <= 1 THEN 1 END) d1, 
    COUNT(DISTINCT CASE WHEN current_date - day <= 7 THEN 1 END) d7, 
    COUNT(DISTINCT CASE WHEN current_date - day <= 14 THEN 1 END) d14 
FROM 
    events 
GROUP BY 
    id 
ORDER BY 
    id 

Oder seit PostgreSQL 9.4, etwas prägnanter:

SELECT 
    id, 
    COUNT(DISTINCT day) FILTER (WHERE current_date - day <= 1) d1, 
    COUNT(DISTINCT day) FILTER (WHERE current_date - day <= 7) d7, 
    COUNT(DISTINCT day) FILTER (WHERE current_date - day <= 14) d14 
FROM 
    events 
GROUP BY 
    id 
ORDER BY 
    id 
+0

Danke, ich denke, das ist in der Nähe, ich bekomme Zahlen über die dN-Werte, gibt es eine Möglichkeit, es an verschiedenen Daten arbeiten zu lassen? –

+0

Dies sieht aus wie das Ticket, hinzugefügt eine Unterabfrage \t (SELECT DISTINCT events.day, id FROM Ereignisse) r –

+1

@martinblank Sie können verschiedene interne Aggregatfunktionen, wie 'COUNT (DISTINCT CASE WHEN aktueller_Datum - Tag <= 1 THEN Tag END) 'oder' COUNT (DISTINCT Tag) FILTER (...) ' – pozs

0

versuchen Sie dies:

SELECT id 
, count(case when DAY = getdate() then 1 else null end) as d1 
, count(case when DAY + 7 >= getdate() then 1 else null end) as d7 
, count(case when DAY + 14 >= getdate() then 1 else null end) as d14 
FROM events 
WHERE DAY between DAY >= getdate() - 14 
--or if you can have day > today ... and DAY between getdate() - 14 and getdate() 
GROUP By id 
Verwandte Themen