2016-04-11 4 views
1

ich diese Daten haben:Postgresql: get erste Element einer geordneten Gruppe nicht funktioniert

| id  | person_id | date    | 
|--------|-----------|---------------------| 
| 313962 | 1111111 | 2016-04-14 16:00:00 | --> this row 
| 313946 | 2222222 | 2015-03-13 15:00:00 | --> this row 
| 313937 | 1111111 | 2014-02-12 14:00:00 | 
| 313944 | 1111111 | 2013-01-11 13:00:00 | 
| ...... | ....... | ................... | 

-Was Ich mag würden, sind die angegebenen Zeilen auszuwählen, das heißt die Zeilen mit dem jüngsten Datum für jede person_id.

-Auch das Ausgabeformat für das Datum dd-mm-YYYY werden müssen

Bisher war ich mit diesem Versuch:

SELECT 
    l.person_id, 
    to_char(DATE(l.date), 'dd-mm-YYYY') AS user_date 
FROM login l 
group by l.person_id 
order by l.date desc 

ich verschiedene Ansätze versuchte, aber ich habe alle Arten von Aggregation Fehlermeldungen wie:

for select distinct order by expressions must appear 

Und

must appear in the GROUP BY clause or be used in an aggregate function 

Irgendeine Idee?

Antwort

1

Es gibt mehrere Möglichkeiten, aber die einfachste Art und Weise (und vielleicht effizienter - aber nicht SQL-Standard) ist auf PostgreSQLs DISTINCT ON verlassen:

SELECT DISTINCT ON (person_id) 
id, person_id , date     
FROM login 
ORDER BY person_id , date desc 

Die Datumsformatierung (wollen Sie das wirklich?) Kann in einem äußeren erfolgen:

+0

Sagt: „auf Ausdruck Distinct auswählen muss Erstbestellung durch Ausdruck übereinstimmen“ –

+0

behoben. Versuche es jetzt. – leonbloy

0

Sie benötigen etwas wie die folgenden, um zu wissen, welches Datum für jede Person zu greifen.

select l.person_id, to_char(DATE(d.maxdate), 'dd-mm-YYYY') 
from login l 
inner join 
    (select person_id, max(date) as maxdate 
    from login group by person_id) d on l.person_id = d.person_id 
order by d.maxdate desc 
0

Sie können es mit einer Unterabfrage, so etwas wie dieses:

SELECT 
    l.person_id, 
    to_char(DATE(l.date), 'dd-mm-YYYY') AS user_date 
FROM login l 
where l.date = (select max(date) from login where person_id = l.person_id) 
order by l.person_id 
Verwandte Themen