2017-06-15 14 views
1

論理比較(lead()、lag()、window)を使用して1つのSQLクエリで結果を取得し、次のn行の集計と行の値を比較したいとします。 |Redshiftで現在の行と次のn行の集計を比較するにはどうすればよいですか?

ID:たとえば

、 私は、次の属性を持つ書籍のデータベースを持っています名前| date_issued |タイプ
1 | abc | 2017-05-01 |本
2 | def | 2017-05-01 |本
3 | xyz | 2017-05-01 |ジャーナル
4 | abc | | 2017-04-30 |書籍
5 | def | 2017-04-29 |書籍

したがって、1日に発行される書籍の数と、今後3日間に発行される書籍数の平均を比較したいと思います。

+0

Iドンこのためにウィンドウ関数が必要だと思います。次の3日間の平均を取得する選択項目のサブクエリ... – ZLK

答えて

1

あなたの特定の質問については、行数は必要ないと思われますが、時間間隔が必要な場合もあります。 1日にN本の本を手に入れて、それを範囲条件で自己結合する必要があります。問い合わせは(ただし、テストしていません)次のようになります。

with 
books_by_day as (
    select date_issued as date, count(1) as books 
    from books 
    group by 1 
) 
select 
t1.date 
,t1.books as books_at_that_date 
,avg(1.0*t2.books) as books_at_next_3_days 
from books_by_day t1 
left join books_by_day t2 
on t2.date between t1.date+interval '1 day' and t1.date+interval '3 days' 
group by 1,2 
order by 1; 
0

ここでは、SELECT文でサブクエリを使用して、あなたはあなたが必要な情報を得ることができる方法の例です:

DECLARE @Books TABLE (Name VARCHAR(255), Date_Issued DATE); 
INSERT @Books VALUES ('ABC', '2017-05-01'), ('DEF', '2017-05-01'), ('XYZ', '2017-05-01'), ('ABC', '2017-04-30'), ('DEF', '2017-04-29'); 

SELECT *, 
     SoldToday = COUNT(*) OVER (PARTITION BY Date_Issued), 
     NextThreeDaysAverage = 
     (
      SELECT AVG(BookCount * 1.0) 
      FROM 
      (
       SELECT BookCount = COUNT(*) 
       FROM @Books AS B2 
       WHERE B2.Date_Issued > B.Date_Issued 
       AND B2.Date_Issued < DATEADD(DAY, 4, B.Date_Issued) 
       GROUP BY B2.Date_Issued 
      ) AS T 
     ) 
FROM @Books AS B; 
関連する問題