以下是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
上将BUYER_ID
与USER_ID
进行比较。在从TestingTable2
进行比较后,我需要找到TestingTable1
中所有(基本上是计数)缺失和不匹配条目。我为此创建了SQL小提琴 -
http://sqlfiddle.com/#!3/d87b2/1
如果您在SQL Fiddle中运行我的查询,您将获得输出 -
BUYER_ID ERROR
1345653 5
three
中TestingTable1
的{{1}}行中的TestingTable2
行正确,而two
上TestingTable1
的{{1}}与BUYER_ID
的{{1}}之间的USER_ID
不匹配}和5
。
现在复杂的事情正在开始。
问题陈述 -
在我当前的输出中,我的ERROR计数为ITEM_ID
。因此,如果您看到表PRODUCT_ID
和CREATED_TIME
中的第一行相同,但LAST_TIME
和1 minute
不相同,则这两次之间的差异仅为{{ 1}}。所以目前我报告的是不匹配,但我需要的是,如果它们之间的差异在15 minutes range
之内,那么我不想报告为错误。因此,在我当前查询中实现此功能后,我将错误计数设为4
,因为第一行的差异在15 minutes range
之内。
所以在从Stack Overflow获得帮助之后,我找到了解决方案,下面是在SQL服务器中正常运行的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
更新: -
AS Per Below WEST评论,输出只显示ERROR计数为1,但它应该显示为4.并且在删除他在SQL小提琴中添加的最后一行后,它不起作用,我得到零错误,这是不对的,因为时差中已经有一个错误。
答案 0 :(得分:1)
如果你做一个等值连接,并将你的时间比较逻辑放在带有SUM的CASE表达式中,而不是COUNT怎么办?
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;
您需要将日期算术转换为任何配置单元使用...
这是一个MS Sql server SQLFiddle,它返回了4个错误。