2017-07-28 8 views
1

各グループの組み合わせに対して最初のn行を取得しようとしています。たとえば、グループごとの最初のn行

次の入力では、製品領域の組み合わせごとに最初の2行を取得したいと思います日によって:

product area date  units 
A  US 2015/08/07 10 
A  US 2015/08/08 12 
A  US 2015/08/09 15 
A  UK 2015/08/07 13 
A  UK 2015/08/10 11 
B  US 2015/08/07 16 
B  US 2015/08/08 17 
B  US 2015/08/09 12 
B  UK 2015/08/07 10 
B  UK 2015/08/08 09 
B  UK 2015/08/09 07 

は、私が試した

product area date  units 
A  US 2015/08/07 10 
A  US 2015/08/08 12 
A  UK 2015/08/07 13 
A  UK 2015/08/10 11 
B  US 2015/08/07 16 
B  US 2015/08/08 17 
B  UK 2015/08/07 10 
B  UK 2015/08/08 09 

返します:

with ordered as (select product, area, date, units, 
          row_number() over (partition by product, area order by date asc) as date_rank 
          from mytable) 
          select product, area, date, units 
          from ordered 
          where date_rank <= 2 
+3

質問にはどのような問題がありますか?あなたの質問は何ですか? –

答えて

1

あなたのクエリは、正しい結果を返します。

with ordered as (
    select product, area, date, units 
    , row_number() over (partition by product, area order by date asc) as date_rank 
    from mytable 
) 
select product, area, date, units 
from ordered 
where date_rank <= 2 
order by product, area desc, date_rank 

rextesterデモ:http://rextester.com/XOMS68876

リターン:

+---------+------+------------+-------+ 
| product | area | date | units | 
+---------+------+------------+-------+ 
| A  | us | 2015-08-07 | 10 | 
| A  | us | 2015-08-08 | 12 | 
| A  | uk | 2015-08-07 | 13 | 
| A  | uk | 2015-08-10 | 11 | 
| B  | us | 2015-08-07 | 16 | 
| B  | us | 2015-08-08 | 17 | 
| B  | uk | 2015-08-07 | 10 | 
| B  | uk | 2015-08-08 |  9 | 
+---------+------+------------+-------+ 
1

CROSS APPLYをお試しください:

SELECT t1.product, t1.area, t2.date, t2.units 
FROM (
    SELECT DISTINCT t1.product, t1.area 
    FROM mytable 
) AS t1 
CROSS APPLY (
    SELECT TOP 2 date, units 
    FROM mytable t2 
    WHERE t1.product = t2.product and t1.area = t2.area 
    ORDER BY date DESC 
) AS t2 
1

あなたはROW_NUMBERを使用することができ、私はそれがあなたのクエリから欠落することができ参照唯一のものは、あなたの最終selectためorder byだろう

SELECT Product, Area, Date, Units 
    FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY product, area ORDER By date ASC) AS xRowNumber FROM MyTable) xyz 
     WHERE xRowNumber < 3 
関連する問題