计算不匹配和丢失

时间:2012-07-21 00:28:27

标签: sql join group-by hive

以下是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

我需要在TestingTable2TestingTable1上将BUYER_IDUSER_ID进行比较。在从TestingTable2进行比较后,我需要找到TestingTable1中所有(基本上是计数)缺失和不匹配条目。我为此创建了SQL小提琴 -

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

如果您在SQL Fiddle中运行我的查询,您将获得输出 -

BUYER_ID    ERROR
1345653       5
threeTestingTable1的{​​{1}}行中的TestingTable2行正确,而twoTestingTable1的{​​{1}}与BUYER_ID的{​​{1}}之间的USER_ID不匹配}和5

现在复杂的事情正在开始。

问题陈述 -

在我当前的输出中,我的ERROR计数为ITEM_ID。因此,如果您看到表PRODUCT_IDCREATED_TIME中的第一行相同,但LAST_TIME1 minute不相同,则这两次之间的差异仅为{{ 1}}。所以目前我报告的是不匹配,但我需要的是,如果它们之间的差异在15 minutes range之内,那么我不想报告为错误。因此,在我当前的查询中实现此功能后,我将错误计数为4,因为第一行的差异在15分钟范围内。

那么如何在当前查询中实现此功能呢?那是我的问题。

P.S-我正在使用Hive和Hive支持类似sql的语法。所以我认为任何修改都可以在我当前的查询中使用。

1 个答案:

答案 0 :(得分: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;