2017-11-28 8 views
0

Amazon Redshiftを使用して、ストリーマ、開始時刻、終了時刻、合計_ストリームという列のテーブルがあります。 Start_timeとend_timeは深夜から秒単位で、ストリーマーは音楽ストリーマーを指し、total_streamersはストリーマーの合計です。どのstart_timeでもいくつのストリーマがあるのか​​把握したい。ここに私が得ているテーブルがあります。稼働中の合計から連続的に減算する

streamers start_time end_time total_streamers 
    2   240   400   2 
    10   300   460   12 
    7   360   514   19 
    12   420   608   31 

私はに実行している問題は、START_TIMEが前end_timesの1を超えると、私はもはや私のtotal_streamersに含まストリーマをしたいということではありません。最初の行end_timeは400であるため、start_timeが400を超えると、その行の2つのストリーマーが除外されます。 これは私の望む結果です。

streamers start_time end_time total_streamers 
    2   240   400   2 
    10   300   460   12 
    7   360   514   19 
    12   420   608   29 

私が尋ねていることについてコードを提供したり、質問を明確にすることができるかどうかを教えてください。前もって感謝します。

+0

あなたの結果は意味をなさない。時刻240には2があります。 300,12; 360 19; 400,17; 460,7で;等々。あなたの数字はどのように計算されますか? –

+0

はい、あなたが書いたものが望ましい結果です。実行中の合計を使用して計算されていますが、実行中の合計ではend_timeが考慮されていません。これはどうやって行うのかわかりません。ストリーマーは、その分に開始されたストリームです。 –

答えて

1
SELECT 
    * 
    ,(SELECT COALESCE(SUM(streamers),0) FROM Table t2 WHERE t2.end_time > t1.start_time AND t2.start_time <= t1.start_time) as total_streamers 
FROM 
    Table t1 

おそらくウィンドウ関数を使ってこれを行う方法がありますが、おそらくサブクエリを持つ派生列として簡単です。

+1

これは完璧に働きました。 –

2

一つの方法は、使用することです。

WITH cte AS (
    SELECT s.n, SUM(tx.streamers) sm 
    FROM generate_series(1,1000) s(n) 
    LEFT JOIN tx ON s.n BETWEEN tx.start_time and tx.end_time 
    GROUP BY s.n 
) 
SELECT DISTINCT tx.*, cte.sm AS total_streamers 
FROM tx 
JOIN cte 
    ON cte.n =tx.start_time 
ORDER BY start_time; 

DBFiddle Demo

出力:

╔═══════════╦════════════╦══════════╦═══════╗ 
║ streamers ║ start_time ║ end_time ║ total ║ 
╠═══════════╬════════════╬══════════╬═══════╣ 
║ 2   ║ 240  ║ 400  ║ 2  ║ 
╠═══════════╬════════════╬══════════╬═══════╣ 
║ 10  ║ 300  ║ 460  ║ 12 ║ 
╠═══════════╬════════════╬══════════╬═══════╣ 
║ 7   ║ 360  ║ 514  ║ 19 ║ 
╠═══════════╬════════════╬══════════╬═══════╣ 
║ 12  ║ 420  ║ 608  ║ 29 ║ 
╚═══════════╩════════════╩══════════╩═══════╝ 

あなたは毎秒の値を得ることができ、必要に応じて:

SELECT s.n, SUM(tx.streamers) sm 
FROM generate_series(1,1000) s(n) 
LEFT JOIN tx ON s.n BETWEEN tx.start_time and tx.end_time 
GROUP BY s.n 
ORDER BY n; 

generate_seriesなしEDIT

WITH cte AS (
    SELECT s.n, SUM(tx.streamers) sm 
    FROM (SELECT ROW_NUMBER() OVER(ORDER BY 1) AS n 
     FROM (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) y(n), 
      (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) x(n), 
      (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) z(n)) s 
    LEFT JOIN tx ON s.n BETWEEN tx.start_time and tx.end_time 
    GROUP BY s.n 
) 
SELECT DISTINCT tx.*, cte.sm 
FROM tx 
JOIN cte 
    ON cte.n =tx.start_time 
ORDER BY start_time; 

DBFiddle Demo

+1

Redshiftは['generate_series']をサポートしていないと思う(http://docs.aws.amazon.com/redshift/latest/dg/c_unsupported-postgresql-functions.html) –

+0

@ VamsiPrabhalaあなたはどんな方法タリー表を生成する。 – lad2025

+0

確かに私は同意します。それは他のユーザーが誤解を招くようなことはないと言います。 –

0

決勝クエリ

WITH q AS 
(
    SELECT 
     t1.start_time, 
     t1.end_time, 
     t2.streamers 
    FROM t t1 
     LEFT JOIN t t2 ON t1.start_time BETWEEN t2.start_time AND t2.end_time 
) SELECT 
    start_time, 
    end_time, 
    SUM(streamers) 
    FROM q 
    GROUP BY start_time, end_time 
    ORDER BY start_time; 

が良い少し変更したバージョンを見て、このクエリを理解するために以下のサブクエリqの 。

SELECT 
    t1.start_time AS original_start_time, 
    t2.start_time AS matching_start_time, 
    t2.end_time AS matching_end_time, 
    t2.streamers AS matching_streamers 
FROM t t1 
    LEFT JOIN t t2 ON t1.start_time BETWEEN t2.start_time AND t2.end_time 
ORDER BY t1.start_time,t2.start_time; 

これでサブクエリが発生します。

original_start_time matching_start_time matching_end_time matching_streamers 

240 240 400 2 

300 240 400 2 
300 300 460 10 

360 240 400 2 
360 300 460 10 
360 360 514 7 

420 300 460 10 
420 360 514 7 
420 420 608 12 

上記の結果には何がありますか?新しい「ストリーム」(例えば、300,460)ごとに、サブクエリは、その新しい「ストリーム」開始時刻が開始時刻と終了時刻の間にあるすべての「ストリーム」(それ自体を含む)を見つける。たとえば、300で、新しいストリーム(300,460)とまだ実行中(240,400)などがあります。

上記の結果が与えられれば、ストリームごとに一致するすべてのストリームの合計ストリーマーのみが必要です。

EDIT Redshfitがlad2025の答えに使用されてきた「定数テーブルとして使用される値リスト」をサポートしていないことを

注意。 http://docs.aws.amazon.com/redshift/latest/dg/c_unsupported-postgresql-features.html

関連する問題