特殊订购与CASE声明 - 需要指导

时间:2013-03-05 01:07:23

标签: sql postgresql sql-order-by case

我正在考虑如何编写此查询。我认为它可能涉及在ORDER BY声明中使用CASE,但我可以使用一些指导。

我有两列数据;身份证和价格。当我按价格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的所有记录并按价格顺序列出,重复....

任何想法?如果我没有充分解释,请告诉我。

3 个答案:

答案 0 :(得分:5)

SELECT ID, PRICE
FROM t
ORDER BY MIN(PRICE) OVER (PARTITION BY ID), PRICE

SQL Fiddle

答案 1 :(得分: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

答案 2 :(得分: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