重写SQL查询来接受where子句中的时间差条件(Rewrite SQL query to acce

2019-10-17 02:09发布

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

我需要比较TestingTable2TestingTable1BUYER_IDUSER_ID 。 我需要找到所有(基本计数)的缺失和不匹配项TestingTable2从比较后TestingTable1 。 我创建SQL小提琴公司招聘

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

如果你运行我在SQL查询拨弄,你会得到输出原样

BUYER_ID    ERROR
1345653       5

这是对去年three从行TestingTable1在缺少TestingTable2和休息two是从比较后不匹配TestingTable1BUYER_IDUSER_ID

现在,复杂的事情开始。

问题陈述-

在我的电流输出,我得到错误计数为5 。 所以,如果你看到第一排的两个表ITEM_IDPRODUCT_ID是相同的,但CREATED_TIMELAST_TIME不一样的,这两个时间之间的区别仅仅是1 minute 。 所以,目前我正在报告为不匹配,但我需要的是,如果它们之间的区别在于内15 minutes range ,那么我不希望报告为错误。 所以在我当前的查询执行此功能后,我会得到错误计数为4 ,因为不同的是内15 minutes range的第一行。

所以从堆栈溢出采取的帮助后,我发现这种情况的解决方案,并在下面的SQL查询的SQL服务器工作正常(这将给错误计数为4),但不是在蜂巢的Hive supports only equality JOINS ,我不能运行下面的查询在蜂巢。 所以,我需要做这个问题的一些其他方式。 是否有可能做莫名其妙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小提琴添加的最后一行之后也,其没有工作,我得到零误差,这是不权已经存在的时间差一个错误。

Answer 1:

如果你做什么的等值连接,并把你的时间比较逻辑CASE表达式的内部用SUM,而不是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个错误。



文章来源: Rewrite SQL query to accept date difference condition in where clause