【发布时间】:2012-07-13 04:46:08
【问题描述】:
以下是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
如果这是 TestingTable2 中的以下数据,则始终按日期降序排序
USER_ID | PRODUCT_ID | LAST_TIME
---------+----------------+-----------------------
1345653 110909316904 2012-07-09 22:29:06
1345653 150851771618 2012-07-09 19:57:33
TestingTable1 中的每一行都应该与TestingTable2 匹配,如果不匹配或TestingTable2 中没有数据,那么我需要在输出中显示它们,如TestingTable1 我有这个数据但对应于TestingTable2我有这个数据(这将是错误的数据),这样我就可以看到什么不匹配,什么数据丢失了。
我需要在BUYER_ID 和USER_ID 上比较TestingTable2 和TestingTable1。我需要看看,如果BUYER_ID 和USER_ID 匹配,那么我需要将ITEM_ID 与PRODUCT_ID 和CREATED_TIME 与LAST_TIME 进行比较,如果TestingTable2 在与@987654342 比较后不匹配@ 在其中一个或两个中,然后我需要显示结果。
所以如果你看上面的例子——我基本上有三个场景
- 首先- 在
TestingTable1中,第一行ITEM_ID与TestingTable2第一行中的PRODUCT_ID匹配,但CREATED_TIME与两个表中第一行的LAST_TIME不匹配 - 其次-在
TestingTable1中,第二行CREATED_TIME与TestingTable2第二行中的LAST_TIME匹配,但ITEM_ID与两个表中第二行的PRODUCT_ID不匹配 -
第三 - 在
TestingTable1中,最后两行(行)在TestingTable2中根本不存在。我写的查询中没有涵盖这种情况。我希望这种情况也出现在我的查询中。
所以这是我在比较TestingTable2 和TestingTable1 时需要涵盖的三种情况。而TestingTable1是MAIN表,需要一直进行比较,这意味着TestingTable1中的数据总是准确的。
因此,如果不匹配其中任何一个或TestingTable2 中根本没有数据-TestingTable1 数据然后在它旁边相同的TestingTable2 数据,我需要显示如下所示的结果,所以我可以看到 TestingTable1 与 TestingTable2 相比有什么价值
BUYER_ID | ITEM_ID | CREATED_TIME | USER_ID | PRODUCT_ID | LAST_TIME
-----------+-----------------+---------------------------+----------------+--------------------+-----------------------
1345653 110909316904 2012-07-09 21:29:06 1345653 110909316904 2012-07-09 22:29:06
1345653 151851771618 2012-07-09 19:57:33 1345653 150851771618 2012-07-09 19:57:33
1345653 221065796761 2012-07-09 19:31:48 NULL NULL NULL
1345653 400307563710 2012-07-09 18:57:33 NULL NULL NULL
下面是我写的查询,它只涵盖我上面提到的two scenarios,它工作正常,我会得到像上面那样的输出,从输出中留下最后两行。但是我还需要在这个(下面)查询中添加third scenario,以便它提供像上面一样的输出。
SELECT *
FROM (SELECT T2.buyer_id,
T2.item_id,
T2.created_time AS created_time,
subq.user_id,
subq.product_id,
subq.LAST_TIME
FROM TestingTable2 subq
JOIN TestingTable1 T2
ON T2.buyer_id = subq.user_id
AND subq.LAST_TIME = ( T2.created_time )
WHERE ( subq.product_id <> T2.item_id )
UNION ALL
SELECT T2.buyer_id,
T2.item_id AS item_id,
T2.created_time,
subq.user_id,
subq.product_id AS product_id,
subq.LAST_TIME
FROM TestingTable2 subq
JOIN TestingTable1 T2
ON T2.buyer_id = subq.user_id
AND subq.product_id = T2.item_id
WHERE ( subq.LAST_TIME <> ( T2.created_time ) )) finalResult
ORDER BY finalResult.BUYER_ID;
任何建议将不胜感激。
附:在过去的几天里,我问了一些与 JOIN 相关的问题,但这仅涵盖了我的两个场景,而不是我在此查询中需要的第三个场景。
更新:-
我不能对 SQL 使用 NOT IN 或 NOT EXISTS 语法,因为我正在使用 Hive 并且 Hive 不支持 NOT IN 或 NOT EXISTS 所以我需要一些其他方法来处理这个问题。
我只需要使用我的查询来修改它以适用于第三场景,因为这样 Hive 将支持 SQL 语法。
下面是我的SQL Fiddle,它满足了我上面的两个场景,但不是第三种场景。谁能帮我修改我的查询以适用于第三种情况?
http://sqlfiddle.com/#!3/102dd/1/0。
Table1中的数据应该在Table2中,如果没有,那么我需要在与Table1比较后显示数据之间的不匹配,也有可能,Table1中的数据不会出现在Table2中,我也想证明这一点。
小提琴http://sqlfiddle.com/#!3/102dd/3/0的更新输出
BUYER_ID | ITEM_ID | CREATED_TIME | USER_ID | PRODUCT_ID | LAST_TIME
-----------+-----------------+---------------------------+----------------+--------------------+-----------------------
1345653 151851771618 July, 09 2012 19:57:33 1345653 150851771618 July, 09 2012 19:57:33
1345653 221065796761 July, 09 2012 19:31:48 1345653 221165796761 July, 09 2012 19:31:48
1345653 110909316904 July, 09 2012 21:29:06 1345653 110909316904 July, 09 2012 22:29:06
1345653 400307563710 July, 09 2012 18:57:33 NULL NULL NULL
1345653 310411560125 July, 09 2012 16:09:49 NULL NULL NULL
更新的 SQL 查询出现错误
我用这个查询替换了TestingTable1-
(SELECT BUYER_ID, ITEM_ID, rank(BUYER_ID), CREATED_TIME
FROM (
SELECT BUYER_ID, ITEM_ID, CREATED_TIME
FROM testingtable1
where to_date(from_unixtime(cast(UNIX_TIMESTAMP(CREATED_TIME) as int))) = '2012-07-09'
DISTRIBUTE BY BUYER_ID
SORT BY BUYER_ID, CREATED_TIME desc
) T1
WHERE rank(BUYER_ID) < 5)
和TestingTable2 这个查询-
(SELECT USER_ID, PROD_AND_TS.PRODUCT_ID as PRODUCT_ID, PROD_AND_TS.TIMESTAMPS as TIMESTAMPS FROM testingtable2 lateral view explode(PURCHASED_ITEM) exploded_table as PROD_AND_TS where to_date(from_unixtime(cast(PROD_AND_TS.TIMESTAMPS as BIGINT))) = '2012-07-09')
【问题讨论】:
-
同一个
(user,item)对是否会在任一表中出现多次? -
这两个表将始终按 created_time 的降序排序。并且这两个表都将仅包含同一日期的数据。 (刚才表格是这样的,它只是实时的)。 Table1 中的每一行都应该在 Table2 中,所以可能是我上面提到的所有三种情况。不,它们不会出现超过一次。
-
看你的fiddle,我修改了数据,结果输出错误,http://sqlfiddle.com/#!3/102dd/3/0,你没看懂我的问题,Table1中的数据应该在Table2中,如果没有,那么我需要在与 Table1 进行比较后显示数据之间的不匹配,并且有可能 Table1 中的数据不会出现在 Table2 中,我也想显示这一点。如果你看看我的输出。
-
基本上 Table1 中的每一行都应该与 Table2 匹配,就像 Table1 中的第一行应该与 Table2 中的第一行一样,可能 ITEM_ID 和 PRODUCT_ID 不匹配,TIME 会匹配,也是可能的 ITEM_ID 和 PRODUCT_ID 将匹配,但 TIME 将不匹配。所以我需要显示对应表1的输出我有这个数据,但是表2中的相同数据是这个(这是错误的数据)。尝试从我给你的 SQL fiddle 上的问题中运行我的查询。你会更好地了解我在寻找什么。我的 SQL 查询适用于我的任务中的两种情况。
-
this 怎么样?
标签: join group-by sql-order-by hql hive