2016-11-08 35 views
0

我有一个表,如:如何在excel或sql中根据日期从一组列中获取前N个记录?

Sr.no .....产品编号...产品ID ...地区... YEAR_MONTH

1 .......... ........ XXX ................... 123 ............北........ ..201605 2 .................. XXX ................... 123 ...... ......北.......... 201604 3 .................. YYY ........... ........ 124 ............南.......... 201510 4 ............... ... YYY ................... 124 ............南.......... 201509 5 .................. YYY ................... 124 ........... .South .......... 201507 6 .................. ZZZ ................ ... 125 ............西........... 2 01612 7 .................. ZZZ ................... 125 ........ ....西........... 201611 8 .................. ZZZ ............ ....... 125 ............西........... 201604 9 ............... ... ZZZ ................... 125 ............西........... 201603

集团的产品编号,产品ID,地区是独一无二的,我需要的每组记录第n个,用不间断的连续下降几个月,所以我的输出会是这样:

Sr.no .... 。产品代码...产品ID ...地区...年_月 1 .................. XXX ............. ...... 123 ............北.......... 201605 2 ................. .XXX ................... 123 ............北.......... 201604 3 .................. YYY ..... .............. 124 ............南.......... 201510 4 ......... ......... YYY ................... 124 ............南....... ... 201509 5 .................. ZZZ ................... 125 ..... .......西........... 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,其中记录通过计算行号和序列号,并从另一个中减去一个来分组。行号很容易,可以使用ROW_NUMBER()分析函数进行计算。该序列需要是一些函数,对于当前组中的每条记录,该序号都会增加1。对于您的数据,我们可以将MONTHS_BETWEEN()函数与分析MAX(year_month)结合使用。从SEQ减去RN得到GRP。我们得到的只是第一组,所有你需要做的是限制GRP=0

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

这仅仅是一个样本数据,没有固定的limit.There可以是30个事件组和所有已经连续下降YEAR_MONTH,在这种情况下,我将需要所有这些在我的结果集。我只需要那些连续递减year_month的每组第一记录。 – HunTer

+0

好吧,你的发帖不清楚第一个N是如何确定的,所以我把它理解为第一个2,如示例输出中所示。 – Sentinel

0

在Excel中,建立在H列包含公式

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

和过滤器的辅助柱列,不包括空格。

这假定您的数据按照样本中显示的方式排序,并且日期是实际日期。

enter image description here

相关问题