以下是 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
我有这个数据(这将是错误的数据),这样我就可以看到不匹配的内容以及缺少的数据。
我需要TestingTable2
与TestingTable1
onBUYER_ID
和进行比较USER_ID
。我需要看看,如果BUYER_ID
和USER_ID
匹配,那么我需要比较ITEM_ID
和,如果在PRODUCT_ID
与其中一个或两个比较之后存在不匹配,那么我需要显示结果。CREATED_TIME
LAST_TIME
TestingTable2
TestingTable1
所以如果你看上面的例子——我基本上有三个场景
- 首先
TestingTable1
,在第一行与第一行ITEM_ID
匹配PRODUCT_ID
,TestingTable2
但与两个表中的第一行CREATED_TIME
不匹配LAST_TIME
- 其次
TestingTable1
,在第二行与第二行CREATED_TIME
匹配LAST_TIME
,TestingTable2
但与两个表中的第二行ITEM_ID
不匹配PRODUCT_ID
- 第三 - 在
TestingTable1
中,最后两行(行)根本不存在TestingTable2
。我写的查询中没有涵盖这种情况。我希望在我的查询中也有这种情况。
TestingTable2
因此,这是我在与TestingTable1
always进行比较时需要涵盖的三种情况。并且TestingTable1
是需要始终进行比较的主表,因此这意味着其中的数据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;
任何建议将不胜感激。
PS 在过去的几天里,我问了一些与 JOIN 相关的问题,但这仅涵盖了我的两个场景,而不是我在此查询中需要的第三个场景。
更新:-
我不能使用SQLNOT 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')