查找昨天的每个BUYER_ID的TOP 10最新记录

时间:2012-07-10 01:28:12

标签: sql group-by sql-order-by hive hiveql

这是下表

CREATE TABLE IF NOT EXISTS TestingTable1 
( 
BUYER_ID BIGINT,
ITEM_ID BIGINT, 
CREATED_TIME STRING
)

这是上表中的以下数据 -

BUYER_ID    |    ITEM_ID       |    CREATED_TIME
------------+------------------+-----------------------
1015826235      220003038067        2012-07-09 19:40:21,
1015826235      300003861266        2012-07-09 18:19:59,
1015826235      140002997245        2012-07-09 09:23:17,
1015826235      210002448035        2012-07-09 22:21:11,
1015826235      260003553381        2012-07-09 07:09:56,
1015826235      260003553382        2012-07-09 19:40:39,
1015826235      260003553383        2012-07-09 06:58:47,
1015826235      260003553384        2012-07-09 07:28:47,
1015826235      260003553385        2012-07-09 08:48:47,
1015826235      260003553386        2012-07-09 06:38:47,
1015826235      260003553387        2012-07-09 05:38:47,
1015826235      260003553388        2012-07-09 04:55:47,
1015826235      260003553389        2012-07-09 06:54:37,
34512201        597245693           2012-07-09 16:20:21,
34512201        8071787728          2012-07-09 15:19:59,
34512201        5868222883          2012-07-09 08:23:17,
34512201        2412180494          2012-07-09 22:21:11,
34512201        2422054205          2012-07-09 06:09:56,
34512201        1875744030          2012-07-09 19:40:39,
34512201        5639158173          2012-07-09 06:58:47,
34512201        5656232360          2012-07-09 07:28:47, 
34512201        959188449           2012-07-09 08:48:47,
34512201        4645350592          2012-07-09 06:38:47,
34512201        5657320532          2012-07-09 05:38:47,
34512201        290419656539        2012-07-09 04:55:47,

如果您在表格中看到上述数据,则只有两个唯一BUYER_ID,与我ITEM_IDCREATED_TIME相对应。每当我要为每个BUYER_ID解雇此查询(即昨天的日期)时,我只需要在今天的日期前一天的最新记录基础。

因此对于BUYER_ID - 34512201BUYER_ID每个CREATED_TIME基础上的最新记录仅为昨天的日期。

每个BUYER_ID都可以包含任何一天的数据。但是我通过CREATED_TIME

检查今天的数据(总是指昨天的日期)前一天特别感兴趣

查看昨天日期的每个TOP 10的{​​{1}}最新数据。以下是我应该获得的与每个BUYER_ID对应的示例输出。

示例输出。

BUYER_ID

我正在使用BUYER_ID | ITEM_ID | CREATED_TIME ------------+------------------+----------------------- 34512201 2412180494 2012-07-09 22:21:11 34512201 1875744030 2012-07-09 19:40:39 34512201 597245693 2012-07-09 16:20:21 34512201 8071787728 2012-07-09 15:19:59 34512201 959188449 2012-07-09 08:48:47 34512201 5868222883 2012-07-09 08:23:17 34512201 5656232360 2012-07-09 07:28:47 34512201 5639158173 2012-07-09 06:58:47 34512201 4645350592 2012-07-09 06:38:47 34512201 2422054205 2012-07-09 06:09:56 1015826235 210002448035 2012-07-09 22:21:11 1015826235 260003553382 2012-07-09 19:40:39 1015826235 220003038067 2012-07-09 19:40:21 1015826235 300003861266 2012-07-09 18:19:59 1015826235 140002997245 2012-07-09 09:23:17 1015826235 260003553385 2012-07-09 08:48:47 1015826235 260003553384 2012-07-09 07:28:47 1015826235 260003553381 2012-07-09 07:09:56 1015826235 260003553383 2012-07-09 06:58:47 1015826235 260003553389 2012-07-09 06:54:37 Hive支持SQL语法。所以我需要确保SQL也应该在Hive环境中工作。

任何人都可以帮我吗?

更新: -

我正在使用以下查询,我需要从以下查询获得前10名,并且需要再添加一个限定符以进行日期检查,这意味着在Hive - 我不能在这里使用where clause for yesterday's date Hive不支持TOP 10 sql语法。我需要一些其他方法来解决这个问题。

TOP 10

再续订一次: -

我使用SELECT * FROM TestingTable1 WHERE ORDER BY buyer_id, created_time DESC; 编写了以下查询。

RANK UserDefinedFunction

这是Java中的RANK UDF函数 -

SELECT buyer_id, item_id, created_time, rk
FROM (
    SELECT buyer_id, item_id, rank(item_id) as rk, created_time
    FROM testingtable1
    DISTRIBUTE BY buyer_id, item_id
    SORT BY buyer_id, item_id, created_time desc
) a 
WHERE rk < 10
ORDER BY buyer_id, created_time, rk;

以上查询不能按照我想要的方式工作,我想在那个查询中会有某种扭曲。

有没有办法在HiveQL中不使用任何UDF?

3 个答案:

答案 0 :(得分:2)

  SELECT FIRST 10 *
    FROM TestingTable1
   WHERE buyer_id = 34512201
ORDER BY created_time DESC;

答案 1 :(得分:0)

我来晚了回答这个问题,我确定您一定知道Hive使用row_number函数。只是作为对以前的良好讨论的参考。

select * from
(select buyer_id,item_id,created_time, row_number() over(partition by buyer_id over
created_time asc) row_num from yourtable)tab
where tab.row_num<=5;

答案 2 :(得分:0)

select * 
from (select buyer_id,item_id,created_time,row_num() over (partition by buyer_id order by created_time DESC)) a 
where a.row_num<=10