2016-04-11 8 views
1

を働いていない取得私は、このデータを持っている:私は選択したい - 何Postgresqlの:順序付けされたグループの最初の項目は

| 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 | 
| ...... | ....... | ................... | 

が示された行、各PERSON_IDの最新の日付を持つ、すなわち行です。日付の出力形式は、しなければならないDD-MM-YYYY -Also

これまでのところ、私はこれをしようとしていた:

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 

私は別のアプローチをしようとしていたが、私はすべての種類の持っています集計のエラーメッセージのような:

for select distinct order by expressions must appear 

そして

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

ご存じですか?

答えて

1

は、いくつかの方法がありますが、最も簡単な方法(そしておそらくより効率的な - ではなくSQL標準では)PostgreSQLのDISTINCT ONに依存することです:

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

日付フォーマット(あなたが本当にそれをしたいですか?)することができます

SELECT id,person_id, to_char(DATE(date), 'dd-mm-YYYY') as date 
    FROM ( 
    SELECT DISTINCT ON (person_id) 
    id, person_id , date     
    FROM login 
    ORDER BY person_id, date desc) 
    AS XXX; 
+0

は言っている: 「表現上の個別選択式で、最初の順序と一致する必要があります」固定 –

+0

。今すぐやってみて下さい。 – leonbloy

0

各人物を取得する日付を知るには、次のようなものが必要です。

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

あなたはサブクエリでそれを行うことができ、このような何か:

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 
関連する問題