下面是始终降序按日期排序在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
上BUYER_ID
和USER_ID
。 我需要看到,如果BUYER_ID
和USER_ID
被匹配的话,我需要比较ITEM_ID
与PRODUCT_ID
和CREATED_TIME
有LAST_TIME
,如果存在不匹配TestingTable2
与比较后TestingTable1
在他们或他们两人中的任何一个,那么我需要证明结果。
所以,如果你看一下上面的示例 - 我有三个基本的场景
- Firstly-在
TestingTable1
,在第一行ITEM_ID
与匹配PRODUCT_ID
的第一行TestingTable2
但CREATED_TIME
不匹配LAST_TIME
在两个表的第一行 - Secondly-在
TestingTable1
,在第二行中CREATED_TIME
与匹配LAST_TIME
的第二行中TestingTable2
但ITEM_ID
不与匹配PRODUCT_ID
在两个表的第二行 - Thirdly-在
TestingTable1
,最后两行(行)是不是有在所有TestingTable2
。 此方案不涉及我查询我写的。 我想这种情况下也是在我的查询 。
因此,这些都是这三种情况下,我需要在比较覆盖TestingTable2
与TestingTable1
始终。 而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我已经要求在过去的几天里加入相关的几个问题,但只覆盖我的两个场景,没有第三种情况,我需要在此查询。
更新: -我不能使用NOT IN
或NOT EXISTS
语法SQL,因为我与蜂巢工作,蜂房不支持NOT IN
或NOT EXISTS
说,所以我需要一些其他的方式来解决这个问题。
我需要用我的查询只修改为第三个方案工作,因为这样蜂房支持SQL语法。
下面是我的SQL小提琴 ,即满足上述但不是我的两个方案中的第三个方案。 谁能帮我修改我的查询,为第三个方案的工作呢?
http://sqlfiddle.com/#!3/102dd/1/0 。
在表1的数据应该是有表2中,如果它不存在,那么我需要从表1的比较,也有可能,从表1的数据不会在表2在那里后,显示的数据之间的不匹配,我想证明太。
对于小提琴更新的输出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')