重写SQL查询以接受where子句中的日期差异条件

时间:2012-07-23 19:17:34

标签: 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 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小提琴中添加的最后一行后,它不起作用,我得到零错误,这是不对的,因为时差中已经有一个错误。

1 个答案:

答案 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个错误。