【发布时间】:2012-07-08 20:19:18
【问题描述】:
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;
通过使用上述查询,我得到以下输出。
USER_ID | PRODUCT_ID | TIMESTAMPS
------------+------------------+-------------
1015826235 220003038067 1004841621
1015826235 300003861266 1005268799
1015826235 140002997245 1061569397
1015826235 *200002448035* 1005542471
如果比较上面的output from the query with the below Table2 data,那么last line of above output中的product_id与下面Table2数据中最后一行的ITEM_ID不匹配。
BUYER_ID | ITEM_ID | CREATED_TIME
-------------+-------------------+------------------------
1015826235 220003038067 2001-11-03 19:40:21
1015826235 300003861266 2001-11-08 18:19:59
1015826235 140002997245 2003-08-22 09:23:17
1015826235 *210002448035* 2001-11-11 22:21:11
所以我的问题是
查找与特定 BUYER_ID 或 USER_ID 对应的 Table2 数据不匹配的所有 PRODUCT_ID(ITEM_ID) 和 TIMESTAMPS(CREATED_TIME)。
所以我需要为上面的例子显示这样的结果-
BUYER_ID | ITEM_ID | CREATED_TIME | USER_ID | PRODUCT_ID | TIMESTAMPS
-----------+-------------------+-------------------------+---------------+------------------+------------------
1015826235 *210002448035* 2001-11-11 22:21:11 1015826235 *200002448035* 1005542471
我需要加入我用 table2 编写的上述查询以获得上述结果。所以我需要在 JOINING 过程中使用我上面的查询。这让我很困惑。任何建议将不胜感激。
更新:-
我编写了以下查询,但不知何故我无法实现我想要实现的输出。谁能帮我解决这个问题?
SELECT table2.buyer_id, table2.item_id, table2.created_time from
(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) prod_and_ts JOIN table2 where
prod_and_ts.user_id = table2.buyer_id
and (product_id <> table2.item_id or
timestamps <> UNIX_TIMESTAMP(table2.created_time));
【问题讨论】:
-
我正在使用 Hive,并且 Hive 支持类似 SQL 的语法,因此我将此问题标记为
sql和join。所以 JOIN 将在 HIVE 中工作。我基本上只需要加入。所以我认为Oracle语法会很好。 -
为什么最后一行不匹配?是不是因为时间戳和创建时间不匹配?
-
我不确定我写的实际查询是否正确。这让我很困惑。所以不确定上面的查询是否正确。
-
您的查询看起来不错;通过替换上面查询中的所有内容来尝试以下 JOIN ) prod_and_ts : LEFT JOIN table2 where prod_and_ts.user_id = table2.buyer_id and product_id = table2.item_id AND timestamps = UNIX_TIMESTAMP(table2.created_time) WHERE table2.item_id IS NULL - 这应该选择在用户、产品和时间戳上不匹配的所有行
-
我不确定您的查询是否正确,因为您提到的查询中有两个 where 子句。你确定你的查询是正确的?