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にある場合、エラーとして報告したくないということです。したがって、現在のクエリにこの機能を実装した後、最初の行の差が 15 分の範囲内であるため、エラー カウントは 4 になります。

では、現在のクエリにこの機能を実装するにはどうすればよいでしょうか? それが私の質問です。

PS-私はHiveを使用しており、HiveはSQLのような構文をサポートしています。したがって、現在のクエリではどのような変更でも機能すると思います。

4

1 に答える 1

1

SQL Server SQL Fiddleクエリは、次のように変更して機能させることができます。ただし、Hiveがdatediffをサポートしているかどうかはわかりません

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;
于 2012-07-21T00:53:02.733 に答える