1

以下は、TestingTable1 のデータです。

BUYER_ID   |   ITEM_ID         |    CREATED_TIME
-----------+-------------------+------------------------
1345653        110909316904         2012-07-09 21:29:06
1345653        151851771618         2012-07-09 19:57:33
1345653        221065796761         2012-07-09 19:31:48
1345653        400307563710         2012-07-09 18:57:33
1345653        310411560125         2012-07-09 16:09:49
1345653        120945302103         2012-07-09 13:40:23
1345653        261060982989         2012-07-09 09:02:21

以下は、TestingTable2 のデータです。

USER_ID   |   PRODUCT_ID           |    LAST_TIME
-----------+-------------------+-------------------
1345653       110909316904         2012-07-09 21:30:06
1345653       152851771618         2012-07-09 19:57:33
1345653       221065796761         2012-07-09 19:31:48
1345653       400307563710         2012-07-09 18:57:33

onとを比較TestingTable2する必要があります。そして、から比較した後、すべての(基本的にはカウント)欠落エントリと不一致エントリを見つける必要があります。これのためにSQLフィドルを作成しました-TestingTable1BUYER_IDUSER_IDTestingTable2TestingTable1

http://sqlfiddle.com/#!3/d87b2/1

私のクエリを SQL Fiddle で実行すると、次のような出力が得られます-

BUYER_ID    ERROR
1345653       5

からの最後のthreeTestingTable1が で欠落しており、 onとからの比較後にTestingTable2残りが不一致であるため、これは正しいです。twoTestingTable1BUYER_IDUSER_ID

今、複雑なことが始まります。

問題文-

現在の出力では、エラー カウントが になってい5ます。したがって、両方のテーブルの最初の行が と である場合、ITEM_IDPRODUCT_IDは同じですがCREATED_TIME、 とLAST_TIMEは同じではなく、これら 2 つの時間の差は だけ1 minuteです。現在、私はそれを不一致として報告していますが、必要なのは、それらの違いが 以内15 minutes rangeにある場合、エラーとして報告したくないということです。したがって、現在のクエリにこの機能を実装した後、最初の行の4差が範囲内であるため、エラーカウントが発生します。15 minutes range

したがって、スタックオーバーフローの助けを借りて、これに対する解決策を見つけました。以下は、SQLサーバーで正常に機能するSQLクエリです(エラーカウントは4になります)が、Hiveでは機能せず、HiveHive supports only equality JOINSで以下のクエリを実行できません. したがって、この問題を解決するには別の方法が必要です。どういうわけかwhere句で日付差条件を行うことは可能ですか? Basically how I can rewrite the below SQL query上記のすべての要件を満たすような他の方法で。

SELECT  TT.BUYER_ID,
        COUNT(*)
FROM    (
          SELECT    testingtable1.buyer_id,
                    testingtable1.item_id,
                    testingtable1.created_time
          FROM      testingtable2
                    RIGHT JOIN testingtable1
                        ON (
                             testingtable1.item_id = testingtable2.product_id
                             AND testingtable1.BUYER_ID = testingtable2.USER_ID
                             AND ABS(DATEDIFF(mi, testingtable1.created_time, testingtable2.last_time)) <= 15
                           )
          WHERE     testingtable2.product_id IS NULL
        ) TT
GROUP BY TT.BUYER_ID;

上記の機能を実装した後に必要な予想出力-

BUYER_ID    ERROR
1345653       4

アップデート:-

AS 以下の WEST コメントによると、出力には ERROR カウントが 1 としか表示されませんが、4 と表示されるはずです。また、彼が SQL フィドルに追加した最後の行を削除した後、それは機能せず、ゼロ エラーが発生していますが、これはそうではありません時差にすでに1つのエラーがあるためです。

4

1 に答える 1

1

等結合を実行し、時間比較ロジックを COUNT ではなく SUM を使用して CASE 式内に配置するとどうなるでしょうか?

SELECT  TT1.BUYER_ID,
        SUM(CASE WHEN ABS(DATEDIFF(mi, TT1.created_time, TT2.last_time)) <= 15 THEN 0
                 ELSE 1
            END) AS ERROR
FROM    testingtable1 TT1
        LEFT JOIN testingtable2 TT2
            ON (
                 TT1.item_id = TT2.product_id
                 AND TT1.BUYER_ID = TT2.USER_ID
               )
GROUP BY TT1.BUYER_ID;

日付演算をハイブが使用するものに変換する必要があります...

これは、4 つのエラーが返されるMS Sql サーバー SQLFiddleです。

于 2012-07-23T19:39:19.203 に答える