2016-11-03 5 views
1

価格を階層化した商品価格のリストがあります。階層レベルは、クラスタ,およびシェルフです。複数の階層レベルで値を持つ行を並べ替える

Unsorted products prices

私は階層的にこれらの製品価格をソートしたいと思います。各レベルをソートする必要があります。ここでは期待された結果の一例である:

Expected result

今、私は棚のレベルではなく、まだ店またはクラスタレベルでの価格を並べ替えることができます。

SELECT cluster_id, store_id, shelf_id, price FROM (
    SELECT * FROM (
     SELECT p.*, 
      ROW_NUMBER() OVER (
       ORDER BY 
       cluster_id ASC NULLS FIRST, 
       store_id ASC NULLS FIRST, 
       price DESC 
      ) AS rn 
     FROM (SELECT * FROM products) p 
    ) 
) 
ORDER BY rn; 

私の実際の結果は次のとおりです。

My actual result

私はOracle Database 12cを使用しています。

サンプル・データ

CREATE TABLE products (
    cluster_id  VARCHAR2(30), 
    store_id  VARCHAR2(30), 
    shelf_id  VARCHAR2(40), 
    price   NUMBER(*,2) 
); 

INSERT INTO products VALUES ('10','230',NULL,120); 
INSERT INTO products VALUES (NULL,NULL,NULL,500); 
INSERT INTO products VALUES ('10','230','967',40); 
INSERT INTO products VALUES ('10',NULL,NULL,300); 
INSERT INTO products VALUES ('50','430','863',50); 
INSERT INTO products VALUES ('50','170',NULL,70); 
INSERT INTO products VALUES ('10','500','783',100); 
INSERT INTO products VALUES ('50','170','798',20); 
INSERT INTO products VALUES ('50','480',NULL,80); 
INSERT INTO products VALUES ('50','430',NULL,50); 
INSERT INTO products VALUES ('10','500',NULL,180); 
INSERT INTO products VALUES ('50','480','486',60); 
INSERT INTO products VALUES ('10','230','296',80); 
INSERT INTO products VALUES ('50',NULL,NULL,200); 
INSERT INTO products VALUES ('10','500','344',80); 
INSERT INTO products VALUES ('50','480','234',20); 
INSERT INTO products VALUES ('50','170','368',50); 

答えて

0

この注文方法は、所望の出力が得られます。

select p.* 
    from products p 
    order by 
     sum(case when store_id is not null and shelf_id is not null then price end) 
      over (partition by cluster_id) desc, 
     sum(case when store_id is not null and shelf_id is not null then price end) 
      over (partition by cluster_id, store_id) desc, 
     case when shelf_id is null then 1 end, price desc 
0

私はこれが機能すると思います。

with t as (
    select cluster_id 
    , store_id 
    , shelf_id 
    , price 
    , row_number() over (partition by cluster_id order by price desc) cluster_sort 
    , row_number() over (partition by cluster_id, store_id order by price desc) store_sort 
    , row_number() over (partition by cluster_id, store_id, shelf_id order by price desc) shelf_sort 
) 
select cluster_id 
, store_id 
, shelf_id 
, price 
from t 
order by cluster_sort 
, store_sort 
, shelf_sort 
; 
+0

あなたのクエリがない作品、それ価格によるソートすべてのクラスタ、価格などによって、すべてのカップルのクラスタ/ストアを行います... –

関連する問題