【问题标题】:SQL ordering - select top rows within top rowsSQL 排序 - 在顶行中选择顶行
【发布时间】:2016-12-08 17:05:53
【问题描述】:

为这个糟糕的标题道歉 - 无法想出更好的东西。

我有下表:

Customer_ID    Item_ID        sale_ID   sale_TS
103293         I-0394039    S-430943    20161101

我需要找到销售额最高的前 100 位客户,以及他们在给定时间范围内购买的前 100 件商品。这是我目前所拥有的:

select vs.Customer_ID, vs.Item_ID, count(*) count2
from sales.sales_import si1
join
(
    select Customer_ID, count(*) s_count2 from sales.sales_import where
    sale_TS between '2016-01-01' and '2016-01-31' group by Customer_ID order by sale_TS desc limit 100
)
si2
on si1.Customer_ID = si2.Customer_ID
where
si1.sale_TS between '2016-01-01' and '2016-01-31'
group by  vs.Customer_ID, vs.Item_ID
order by vs.Customer_ID, count2 desc limit 100

问题:

  • 我基本上是在这里将表连接到自身,有没有更好的方法?
  • 如何限制查询仅返回每个 Customer_ID 的前 100 项?这里的外部限制将限制所有行,而不是每个 customerID 的第一个 X

【问题讨论】:

    标签: sql hive limit


    【解决方案1】:

    试试 row_number 函数。您必须构建 2 个派生表(在 FROM 子句中使用的子查询)。一份给客户,一份给他们的物品。内部连接子查询,因此您只能从第一个派生表中返回的客户那里获取商品。

    select * from
    --get your top 100 customers
      (select * from 
         (select Customer_ID, row_number() OVER (order by sale_TS) as rank
         from sales_import
         where sale_TS between '2016-01-01' and '2016-01-31'
         group by Customer_ID)
       where rank <= 100) custs
     --now build out a derived table that picks out the top 100 items they purchased using the same method
    

    (select blah blah blah from (select blah blah blah)) 项目

       --now inner join your 2 derived tables
    where custs.Customer_ID, = items.Customer_ID
    

    【讨论】:

    • 这里的排名只会根据 Sale_TScolumn 为您提供一个行号,与销售数量无关。
    猜你喜欢
    • 1970-01-01
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 2015-10-12
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多