2017-10-08 152 views
1

我需要一些子查詢的幫助。 我想在第一列進行分組,然後在第二列進行分組,然後選擇MIN,在第三列進行排序並從第四列中選擇與MIN關聯的值。Postgresql子查詢

像這樣

| subject | id | num | code | 
|---------|----|-----|------| 
| 2  | 34 | 45 | 1234 | 
| 2  | 34 | 3 | 1267 | 
| 3  | 23 | 32 | 2345 | 
| 3  | 23 | 16 | 4568 | 
| 3  | 30 | 12 | 5678 | 
| 5  | 29 | 53 | 2354 | 


| subject | id | num | code | 
|---------|----|-----|------| 
| 2  | 34 | 3 | 1267 | 
| 3  | 23 | 16 | 4568 | 
| 5  | 29 | 53 | 2345 | 
+0

diid你只需要改變的數據或預期的結果? –

+0

對不起,我感到困惑。不,我沒有改變數據或預期的結果。我試圖讓它看起來像一張桌子。 – sac

+0

要格式化爲表格,只需按4個字符縮進每行。工具欄中有一個按鈕{},它也會爲你做。 –

回答

0

一種可能的方式是使用LATERAL subquery和ORDER BY XXX LIMIT 1

現場演示:http://sqlfiddle.com/#!17/71480/6

SELECT y.* 
FROM (
    SELECT distinct subject 
    FROM table1 
) x, 
LATERAL (
    SELECT * FROM table1 t 
    WHERE t.subject = x.subject 
    ORDER BY id, num 
    LIMIT 1 
) y 
order by 1 

| subject | id | num | code | 
|---------|----|-----|------| 
|  2 | 34 | 3 | 1267 | 
|  3 | 23 | 16 | 4568 | 
|  5 | 29 | 53 | 2354 | 
0

查找該行與最小(最大)值等價於求其具有較低(高)值沒有行存在rowfor:


SELECT * 
FROM ztable zt 
WHERE NOT EXISTS(
     SELECT * FROM ztable nx 
     WHERE nx.subject = zt.subject 
     AND nx.num < zt.num 
     AND nx.id < zt.id 
     );