下面是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
我需要TestingTable2
比较TestingTable1
onBUYER_ID
和USER_ID
。我需要TestingTable2
在比较 from 之后找到所有(基本上是计数)丢失和不匹配的条目TestingTable1
。我为此创建了 SQL 小提琴 -
http://sqlfiddle.com/#!3/d87b2/1
如果你在 SQL Fiddle 中运行我的查询,你会得到输出——
BUYER_ID ERROR
1345653 5
这是正确的,因为从on和比较后的最后three
一行TestingTable1
缺失TestingTable2
,其余行two
不匹配。TestingTable1
BUYER_ID
USER_ID
现在复杂的事情开始了。
问题陈述-
在我当前的输出中,我得到 ERROR count as 5
。因此,如果您在两个表中看到第一行ITEM_ID
并且PRODUCT_ID
相同但不相同,CREATED_TIME
并且LAST_TIME
这两次之间的差异仅为1 minute
. 所以目前我将其报告为不匹配,但我需要的是,如果它们之间的差异在 范围内15 minutes range
,那么我不想报告为错误。因此,在我当前的查询中实现此功能后,我将获得错误计数,4
因为差异在15 minutes range
第一行之内。
因此,在从 Stack Overflow 获得帮助后,我找到了解决方案,下面是在 SQL Server 中运行良好的 sql 查询(错误计数为 4),但在 Hive 中却不行,Hive supports only equality JOINS
我无法在 Hive 中运行以下查询. 所以我需要一些其他的方法来解决这个问题。是否可以在 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
更新:-
根据下面的 WEST 评论,输出仅显示错误计数为 1,但它应该显示为 4。而且在删除他在他的 SQL 小提琴中添加的最后一行之后,它不起作用,我得到零错误,这不是是的,因为时差已经有一个错误。