【问题标题】:Special ORDER BY with CASE statement - In need of guidance带有 CASE 声明的特殊 ORDER BY - 需要指导
【发布时间】:2013-02-19 06:41:08
【问题描述】:

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

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

有什么想法吗?如果我解释得不够清楚,请告诉我。

【问题讨论】:

  • 您需要执行类似 ORDER BY 的操作,然后按子查询/临时表进行排序,该表已按最低价格对 ID 进行排序,并生成一个从 1 到 N 排列的列。然后您可以将您的行 ID 与该子查询/临时表的索引相关联,按此排序将为您提供所需的顺序。然后您可以进行二级排序(如按 x、y 排序)以按价格进行子排序。

标签: sql postgresql sql-order-by case


【解决方案1】:
SELECT ID, PRICE
FROM t
ORDER BY MIN(PRICE) OVER (PARTITION BY ID), PRICE

SQL Fiddle

【讨论】:

  • 是的,我也喜欢这个选项。非常直接。
【解决方案2】:

您正在使用 Postgres,因此您具有窗口功能。这是您需要的 SQL 示例:

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

【讨论】:

    【解决方案3】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-28
      • 2018-08-03
      • 2022-01-13
      • 1970-01-01
      • 2021-07-14
      相关资源
      最近更新 更多