微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

这是下表
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,

如果您在表中看到上述数据,则只有两个UNIQUE BUYER_ID,并且对应于我有ITEM_ID和CREATED_TIME的那些.每当我将为每个BUYER_ID触发此查询(意味着昨天的日期)时,我只需要在今天的日期前一天的时间上记录10个最新记录.

所以对于这个BUYER_ID – 34512201我在CREATED_TIME的每个BUYER_ID基础上需要10个最新记录,仅用于昨天的日期.

每个BUYER_ID都可以包含任何一天的数据.但是我通过在CREATED_TIME检查,对今天的数据(总是指昨天的日期)前一天特别感兴趣

查找昨天的每个BUYER_ID的TOP 10最新数据.下面是我应该得到的每个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和Hive支持sql语法.所以我需要确保sql也应该在Hive环境中工作.

谁能帮我这个?

更新: –

我正在使用下面的查询,我需要从下面的查询中获得前10名,并且需要为日期检查添加一个限定符,意味着在昨天的日期的where子句中 – 我不能在这里使用TOP 10,因为Hive不支持TOP 10个sql语法.我需要一些其他方法解决这个问题.

SELECT * FROM TestingTable1 WHERE ORDER BY buyer_id,created_time DESC;

还有一个更新: –

我使用RANK UserDefinedFunction在下面的查询中写了这个.

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

这是Java中的RANK UDF函数

package com.example.hive.udf;
import org.apache.hadoop.hive.ql.exec.UDF;

    public final class Rank extends UDF{
        private int  counter;
        private String last_key;
        public int evaluate(final String key){
          if ( !key.equalsIgnoreCase(this.last_key) ) {
             this.counter = 0;
             this.last_key = key;
          }
          return this.counter++;
        }
    }

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

如果不在HiveQL中使用任何UDF,有没有办法做到这一点?

解决方法

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

原文地址:https://www.jb51.cc/mssql/83409.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐