2017-12-20 11 views
1

私はほぼ同様の作業を行っている2つのクエリを持っています。 CTEなしで1つ、CTEで1つ。私はなぜ2番目のクエリが最初の1つの間に全く結果を与えないのか理解できません。ハイブでCTEを使用する際にエラーが発生しました。

さまざまな結合を試みることによってこれを理解しようとしていて、過去2時間を費やしています。クエリ1で働いている同じ結合がクエリ2で機能していません。

まずクエリ(結果を返します):

WITH MessageCTE AS 
    (
    SELECT dt 
    , id 
    , ts 
    , family 
    , message_type 
    , to_user 
    , message_id 
    , class 
    FROM dhruv.MessageLatencyInformation_20171210_20171125_to_20171130_02 as latencydata 
    INNER JOIN dhruv.UsersOn503AndAbove_20171201_200k as required_users 
    ON latencydata.to_user = required_users.user_id 
    ) 
SELECT COUNT(DISTINCT to_user) AS Users 
, AVG(latency) AS AvgLatency 
, AVG(CASE WHEN latency > 0 THEN latency ELSE NULL END) AS AvgLatency_Positive 
, PERCENTILE(latency, 0.5) AS 50Percentile 
, PERCENTILE(latency, 0.75) AS 75Percentile 
, PERCENTILE(latency, 0.8) AS 80Percentile 
, PERCENTILE(latency, 0.9) AS 90Percentile 
, PERCENTILE(latency, 0.95) AS 95Percentile 
, PERCENTILE(latency, 0.99) AS 99Percentile 
FROM 
    (
    SELECT a.dt, a.to_user, (latency_dl.ts - latency_pb.ts) as latency 
    FROM 
     (
     SELECT dt 
     , id, ts 
     , family 
     , message_type 
     , to_user 
     , message_id 
     , class 
     FROM MessageCTE 
     WHERE class = 'pb' 
     ) as latency_pb 
    INNER JOIN 
     (SELECT dt 
     , id 
     , ts 
     , family 
     , message_type 
     , to_user 
     , message_id 
     , class 
     FROM MessageCTE 
     WHERE class = 'rdl' 
     AND family = 'stm' 
     ) as latency_rdl 
    ON latency_pb.dt = latency_rdl.dt and latency_pb.to_user = latency_rdl.to_user and latency_pb.id = latency_rdl.id 
    INNER JOIN 
     (
     SELECT dt 
     , id 
     , ts 
     , family 
     , message_type 
     , to_user 
     , message_id 
     , class 
     FROM MessageCTE 
     WHERE class = 'dl' 
     ) as latency_dl 
    ON latency_rdl.dt = latency_dl.dt and latency_rdl.to_user = latency_dl.to_user and latency_rdl.id = latency_dl.id) AS UserLatency; 

最初のクエリ出力:今 First Query Output

2番目のクエリは、わずかな修正とすべて同じ条件ではありませんが、何らかの理由でそれが何を返します一致します。誰かが私を案内してくれることを願っています。私はちょうど2時間かけていくつかの参加を試みました。なぜ彼らが起こっていないのか理解できません。

2番目のクエリ:

WITH MessageCTE_pb AS 
    (
    SELECT dt, id, ts, to_user 
    FROM 
     (
     SELECT dt, id, min(ts) as ts, to_user 
     FROM dhruv.MessageLatencyInformation_20171210_20171125_to_20171130_02 
     WHERE class = 'pb' 
     GROUP BY dt, to_user, id 
     ) as latencydata 
    INNER JOIN dhruv.UsersOn503AndAbove_20171201_200k as required_users 
    ON latencydata.to_user = required_users.user_id 
    ) 
, MessageCTE_dl AS 
    (
    SELECT dt, id, ts, to_use 
    FROM 
     (
     SELECT dt, id, max(ts) as ts, to_user 
     FROM dhruv.MessageLatencyInformation_20171210_20171125_to_20171130_02 
     WHERE class = 'dl' 
     GROUP BY dt, to_user, id 
     ) as latencydata 
    INNER JOIN dhruv.UsersOn503AndAbove_20171201_200k as required_users 
    ON latencydata.to_user = required_users.user_id 
    ) 
, MessageCTE_rdl AS 
    (
    SELECT dt, id, to_user 
    FROM 
     (
     SELECT DISTINCT dt, id, to_user 
     FROM dhruv.MessageLatencyInformation_20171210_20171125_to_20171130_02 
     WHERE class = 'rdl' 
     AND family = 'stm' 
     ) as latencydata 
    INNER JOIN dhruv.UsersOn503AndAbove_20171201_200k as required_users 
    ON latencydata.to_user = required_users.user_id 
    ) 
SELECT COUNT(DISTINCT to_user) AS Users 
, AVG(latency) AS AvgLatency 
, AVG(CASE WHEN latency > 0 THEN latency ELSE NULL END) AS AvgLatency_Positive 
, PERCENTILE(latency, 0.5) AS 50Percentile 
, PERCENTILE(latency, 0.75) AS 75Percentile 
, PERCENTILE(latency, 0.8) AS 80Percentile 
, PERCENTILE(latency, 0.9) AS 90Percentile 
, PERCENTILE(latency, 0.95) AS 95Percentile 
, PERCENTILE(latency, 0.99) AS 99Percentile 
FROM 
    (
    SELECT a.dt, a.to_user, (latency_dl.ts - latency_pb.ts) as latency 
    FROM MessageCTE_pb as latency_pb 
    INNER JOIN MessageCTE_rdl as latency_rdl 
    ON latency_pb.dt = latency_rdl.dt and latency_pb.to_user = latency_rdl.to_user and latency_pb.id = latency_rdl.id 
    INNER JOIN MessageCTE_dl as latency_dl 
    ON latency_rdl.dt = latency_dl.dt and latency_rdl.to_user = latency_dl.to_user and latency_rdl.id = latency_dl.id) AS UserLatency; 

ありがとう!

2番目のクエリ結果: Second Query Result

+0

これは読んでいないと思いますか? https://stackoverflow.com/help/mcveどのステップが分岐するかを知るまで、クエリを分割して試してみてください。その差を現すためにフィルタリングする人々のために、ここでは余計なコードがあります。また、インデントを使用して、サブクエリの開始と終了の場所を明確にしてください。 – MatBailie

+0

チップマットありがとうございます、私はそれを少しずつ壊していることを認識しています。私はそれを試してみましたが、私は違いを見つけることができません。この時点で、私は私の検索を続けながらコミュニティと共有することに決めました。 サブクエリを編集してインデントします。 – DK5

+0

あなたはそれが「わずかな」修正であると考えますか? – MatBailie

答えて

1

ので、私はSQLの束を投稿することができ、応答ブロック内の別のコメント...

この結果は何ですか?

WITH 
    UserLatency AS 
(
    SELECT 
     latencydata.dt, 
     latencydata.to_user, 
     latencydata.id, 
     MAX(CASE WHEN latencydata.class = 'dl' THEN latencydata.ts END) 
     - 
     MIN(CASE WHEN latencydata.class = 'pb' THEN latencydata.ts END) 
      AS latency 
    FROM 
     dhruv.MessageLatencyInformation_20171210_20171125_to_20171130_02 AS latencydata 
    INNER JOIN 
     dhruv.UsersOn503AndAbove_20171201_200k        AS required_users 
      ON latencydata.to_user = required_users.user_id 
    GROUP BY 
     latencydata.dt, 
     latencydata.to_user, 
     latencydata.id 
    HAVING 
     0 < SUM(CASE WHEN latencydata.class = 'rdl' 
         AND latencydata.family = 'stm' THEN 1 END) 
) 
SELECT 
     COUNT(DISTINCT to_user)      AS Users 
    , AVG(latency)         AS AvgLatency 
    , AVG(CASE WHEN latency > 0 THEN latency END) AS AvgLatency_Positive 
    , PERCENTILE(latency, 0.50)      AS 50Percentile 
    , PERCENTILE(latency, 0.75)      AS 75Percentile 
    , PERCENTILE(latency, 0.80)      AS 80Percentile 
    , PERCENTILE(latency, 0.90)      AS 90Percentile 
    , PERCENTILE(latency, 0.95)      AS 95Percentile 
    , PERCENTILE(latency, 0.99)      AS 99Percentile 
FROM 
    UserLatency 
; 
+0

マット、これは美しく、シンプルです。本当にそれが好きだった! :) ありがとうございました! 私のクエリは書き直しにも役立ちましたが、これは非常に優れており、超最適化されています。非常に感謝しています! :) – DK5

+1

@ DK5 - ようこそ。同じテーブルからの類似/関連する行を結合することは、集約を使用して行うことができます。適切なインデックスを使用することで、実行時間が短縮され、コードが短くなります。 – MatBailie

+0

ありがとう、マット、私はあなたがそれに追加したシンプルさを見ることができます、その素晴らしい。非常にはっきりとあなたはその51.1kの評判を得たか分かります!ありがとう、トン! :) – DK5

関連する問題