2013-03-05 52 views
3

我在考慮如何編寫此查詢。我認爲這可能涉及在ORDER BY聲明中有一個CASE,但我可以使用一些指導。帶CASE聲明的特殊ORDER BY - 需要指導

我有兩列數據; ID和價格。當我訂購價格ASC時,我的查詢結果顯示如下:

ID |價格
3 | 150
1 | 200
3 | 205
2 | 210
2 | 230
3 | 270
1 | 300
2 | 340
3 | 500

我在做的是仍然按照價格ASC訂購,但有輕微的變化。我也想按ID進行分組。例如,我希望查詢找到所有結果的最低價格,然後查找具有相同ID的所有其他記錄(以價格ASC順序列出)。一旦找到該ID的所有記錄,查詢就會查找所有其他剩餘記錄,再次查找最低價格,然後重複。所以每次經過這個循環時結果都會減少。對於上述示例,結果將爲:

ID |價格
3 | 150
3 | 205
3 | 270
3 | 500
1 | 200
1 | 300
2 | 210
2 | 230
2 | 340

循環是一樣的東西找到最低的價格,發現所有記錄在價格順序相同的ID和列表中,找到其餘結果的最低價格,找到在價格順序相同的ID和列表中的所有記錄,重複...

任何想法?如果我沒有解釋得很好,請告訴我。

+0

你需要做這樣的事情,ORDER BY,然後順序/臨時表,按照最低價格對ID進行排序,並生成一個列,從1到N排列它們。然後,您可以將行的ID與該子查詢/臨時表的索引關聯起來,給你你想要的訂單。然後,您可以進行二級訂購(按x,y的順序)以按價格進行訂購。 – Patashu 2013-03-05 01:11:16

回答

3

你正在使用Postgres,所以你有窗口的功能。以下是你需要的SQL的一個例子:一個子查詢

select id, price 
from (select t.*, 
      min(price) over (partition by id) as minprice 
     from t 
    ) t 
order by minprice, id, price 
+0

完美的工作!謝謝您的幫助。 – pkracer 2013-03-05 02:09:21

2

SQL Fiddle

select t.id, t.price 
from 
    t 
    inner 
    join (
     select row_number() over(order by price) o, id 
     from (
      select id, min(price) price 
      from t 
      group by id 
     ) s 
    ) s on s.id = t.id 
order by s.o, t.price 
5
SELECT ID, PRICE 
FROM t 
ORDER BY MIN(PRICE) OVER (PARTITION BY ID), PRICE 

SQL Fiddle

+0

這似乎也適用於TSQL。 – 2013-03-05 02:06:35

+0

+1 ...簡單,清晰,而且,它的工作原理... = D – MatheusOl 2013-03-05 02:15:13

+0

是的,我也喜歡這個選項。非常直截了當。 – pkracer 2013-03-05 03:05:02