3

このクエリをどのように記述する必要があるかを考えています。ORDER BYステートメントにCASEを含める必要があると思いますが、少しガイダンスを使用できます。

2 列のデータがあります。IDと価格。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 のすべてのレコードの検索と価格順のリスト、繰り返しのようなものです。

何か案は?うまく説明できていない場合はお知らせください。

4

3 に答える 3

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

SQLフィドル

于 2013-03-05T02:05:22.487 に答える
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
于 2013-03-05T01:23:46.730 に答える
2

SQL フィドル

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
于 2013-03-05T01:54:25.493 に答える