2016-07-26 14 views
1

Ich habe eine Tabelle mit person_id, timestamp und name. Ich versuche, eine Abfrage zu schreiben, um den ersten Zeitstempel für eine Person an einem bestimmten Datum (in einer bestimmten Zeitzone) zu erhalten. Natürlich habe ich FIRST_VALUE und Partitionierung über den Tag versucht, aber nicht sicher, warum es nicht funktioniert.Erster Zeitstempel über eine Fensterfunktion erhalten

SELECT first_value("timestamp") OVER w, 
    date_trunc('day', "timestamp" AT TIME ZONE 'US/Central') 
FROM analytics_analyticsevent as ae 
WHERE person_id=3 
GROUP BY date_trunc('day', "timestamp" AT TIME ZONE 'US/Central') 
WINDOW w as (PARTITION BY date_trunc('day', "timestamp" AT TIME ZONE 'US/Central')) 

Was mich den Fehler gibt:

ERROR: column "ae.timestamp" must appear in the GROUP BY clause or be used in an aggregate function 
LINE 2: SELECT first_value("timestamp") OVER w, 
         ^

Irgendwelche Ideen?

+0

Sie FIRST_VALUE hinzufügen müssen ("Zeitstempel") in der Gruppe von –

Antwort

0

Es sieht aus wie ein Klassiker top-n-per-group. Normalerweise verwenden Menschen ROW_NUMBER, wie folgt aus:

SELECT 
    "timestamp" 
    ,dt 
FROM 
    (
     SELECT 
      "timestamp" 
      ,date_trunc('day', "timestamp" AT TIME ZONE 'US/Central') AS dt 
      ,ROW_NUMBER() OVER 
       (PARTITION BY date_trunc('day', "timestamp" AT TIME ZONE 'US/Central') 
       ORDER BY "timestamp") AS rn 
     FROM analytics_analyticsevent as ae 
     WHERE person_id=3 
    ) AS T 
WHERE 
    T.rn = 1;