1

下面是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比较TestingTable1onBUYER_IDUSER_ID。我需要TestingTable2在比较 from 之后找到所有(基本上是计数)丢失和不匹配的条目TestingTable1。我为此创建了 SQL 小提琴 -

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

如果你在 SQL Fiddle 中运行我的查询,你会得到输出——

BUYER_ID    ERROR
1345653       5

这是正确的,因为从on和比较后的最后three一行TestingTable1缺失TestingTable2,其余行two不匹配。TestingTable1BUYER_IDUSER_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 小提琴中添加的最后一行之后,它不起作用,我得到零错误,这不是是的,因为时差已经有一个错误。

4

1 回答 1

1

如果您进行 equijoin,并将您的时间比较逻辑放在带有 SUM 而不是 COUNT 的 CASE 表达式中怎么办?

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 服务器 SQLFiddle,它返回了 4 个错误。

于 2012-07-23T19:39:19.203 回答