2016-11-08 2 views
0

は私が持っている表のように:excelまたはsqlの日付に基づいて列のグループから最初のN個のレコードを取得する方法は?

Sr.no .....製品コード...プロダクトID ...地域... Year_month

1 .......... ........ XXX ............. 123 ............北........ ..201605 2 .................. XXX ................... 123 ...... ......ノース.......... 201604 3 .................. YYY ........... ........ 124 ............ South .......... 201510 4 ............... ... YYY ................... 124 ............南.......... 201509 5 .................. YYY ................... 124 ............. 。サウス.......... 201507 6 .................. ZZZ ................ ... 125 ............ West ........... 2 01612 7 .................. ZZZ ................... 125 ........ ....ウエスト............. 201611 8 .................. ZZZ ............ ....... 125 ............ West ........... 201604 9 ............... ... ZZZ ................... 125 ............ West ........... 201603

製品コード、商品コード、地域の

グループがユニークである、と私はので、私の出力は次のようになり、休憩なしの連続で減少ヶ月でグループごとのレコードの最初のn個の数を、必要とする:

Sr.no .... 。製品コード...製品ID ...地域...年次 1 .................. XXX ............. ...... 123 ............北.......... 201605 2 ................. .XXX ................... 123 ............ North .......... 201604 3 .................. YYY ..... .............. 124 ............南.......... 201510 4 ......... ......... YYY ............. 124 ............南....... ... 201509 5 .................. ZZZ ................... 125 ..... ....... West ........... 201612 6 .................. ZZZ ......... .......... 125 ............ West ........... 201611

答えて

0

サンプルデータに基づいて、Sr. noは生成された値であり、レコードデータの一部ではありません。次のクエリでは、サブファクトリクエリt1にパーティション化された行番号が生成されます。出力クエリは、データが返されるように、次いでSr.no行番号を追加し、グループごとに返される行の数を制限する。

with t1 as (
SELECT Product_Code 
     , Product_ID 
     , Region 
     , Year_month 
     , row_number() over (partition by product_code, prodcut_id, region order by year_month desc) rn 
    FROM your_data 
) 
select row_number() over (order by product_code, prodcut_id, region, year_month desc) Sr_no 
     , Product_Code 
     , Product_ID 
     , Region 
     , Year_month 
    from t1 
    where rn <= 2; 

PRODUCT_CODEに分配最初のN個の連続Year_Monthレコードを返すには、PRODUCT_IDをそして領域では、Tabibitosanmethodを使用することができます。レコードは、行番号と順序番号を計算し、もう一方から1を減算することによってグループ化されます。行番号は簡単で、解析関数ROW_NUMBER()を使用して計算することができます。シーケンスは、現在のグループ内の各レコードに対して1ずつインクリメントする何らかの関数である必要があります。あなたのデータについては、MAX(year_month)と組み合わせてMONTHS_BETWEEN()関数を使用することができます。 RNSEQから差し引くと、GRPが得られます。今ちょうど最初のグループを取得するには、すべてを行う必要がGRP=0には限界です:Excelで

with your_data(Sr_no, Product_Code, Product_ID, Region, Year_month) as (
    select 1, 'XXX', 123, 'North', date '2016-05-01' from dual union all 
    select 2, 'XXX', 123, 'North', date '2016-04-01' from dual union all 
    select 3, 'YYY', 124, 'South', date '2015-10-01' from dual union all 
    select 4, 'YYY', 124, 'South', date '2015-09-01' from dual union all 
    select 5, 'YYY', 124, 'South', date '2015-07-01' from dual union all 
    select 6, 'ZZZ', 125, 'West', date '2016-12-01' from dual union all 
    select 7, 'ZZZ', 125, 'West', date '2016-11-01' from dual union all 
    select 8, 'ZZZ', 125, 'West', date '2016-04-01' from dual union all 
    select 9, 'ZZZ', 125, 'West', date '2016-03-01' from dual 
), t1 as (
SELECT Product_Code 
     , Product_ID 
     , Region 
     , Year_month 
     , row_number() 
     over (partition by product_code, product_id, region 
        order by year_month desc) rn 
     , months_between(max(year_month) 
         over (partition by product_code, product_id, region) 
         , year_month) + 1 seq 
     , months_between(max(year_month) 
         over (partition by product_code, product_id, region) 
         , year_month) + 1 
     - row_number() 
     over (partition by product_code, product_id, region 
        order by year_month desc) grp 
    FROM your_data 
) 
select * from t1 where grp = 0; 

PRO PRODUCT_ID REGIO YEAR_MONTH     RN  SEQ  GRP 
--- ---------- ----- -------------------- ---------- ---------- ---------- 
XXX  123 North 01-MAY-2016 00:00:00   1   1   0 
XXX  123 North 01-APR-2016 00:00:00   2   2   0 
YYY  124 South 01-OCT-2015 00:00:00   1   1   0 
YYY  124 South 01-SEP-2015 00:00:00   2   2   0 
ZZZ  125 West 01-DEC-2016 00:00:00   1   1   0 
ZZZ  125 West 01-NOV-2016 00:00:00   2   2   0 

6 rows selected 
+0

これは単なるサンプルデータでは、30回の出現とは固定limit.Thereが可能な基が存在しないと、すべては私の結果セットでそれらのすべてを必要とされるだろう、その場合には、year_month減少連続してい。グループあたり最初のレコードが必要なのは、year_monthが連続して減少するレコードだけです。 – HunTer

+0

あなたの投稿は最初のNがどのように決定されたかについてはっきりしていなかったので、サンプル出力に示されているように最初の2つを意味するようにしました。 – Sentinel

0

、式この上

=IF(OR(B2&C2&D2<>B1&C1&D1,AND(EDATE(E2,1)=E1,H1<>"")),A2,"") 

とフィルタを含む列Hでヘルパー列を設定ブランクを除く。

これは、データがサンプルに示されている方法でソートされ、日付が実際の日付であることを前提としています。

enter image description here

関連する問題