首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按顶部n出现的SKU划分的SQL组

按顶部n出现的SKU划分的SQL组
EN

Stack Overflow用户
提问于 2019-07-19 21:23:17
回答 3查看 208关注 0票数 1

我有一张叫billing的桌子

代码语言:javascript
复制
sku_code | invoice_id | sku_amount | sku_sale
integer  | integer    | float      | float

我要做的是先找到sku_code的前350名,由sku_amount

代码语言:javascript
复制
SELECT TOP 350 Sum(sku_amount) AS amt, 
       sku_code
FROM   billing 
GROUP  BY sku_code
ORDER  BY amt DESC 

然后,我想通过上面所示的350个sku_code将整个表按表分割。

我假设这将是某种inner-join,通过一个sub-query,但我不知道语法。

有人能帮忙吗?

我想最后运行的查询是,但是它只返回上面查询中的350个sku_codes。

代码语言:javascript
复制
SELECT sum(sku_amount) as amt,sku_code, invoice_id
from billing 

group by sku_code, invoice_id

order by amt DESC

给我一个应该有2000万到3000万行的表。

代码语言:javascript
复制
amt | sku_code | invoice_id

多谢你们的支持!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-07-20 00:18:07

如果我正确理解,您需要前350个skus的原始行。JOIN应该就足够了:

代码语言:javascript
复制
SELECT b.*
FROM billing b JOIN
     (SELECT TOP 350 Sum(sku_amount) AS amt, 
             sku_code
      FROM billing 
      GROUP BY sku_code
      ORDER BY amt DESC 
     ) s
     ON s.sku_code = b.sku_code
票数 1
EN

Stack Overflow用户

发布于 2019-07-19 21:29:03

如果我理解得对的话,你可以直接用排名。这将提供所有在前350名中拥有sku_amount的记录。

代码语言:javascript
复制
SELECT * 
  FROM (
    SELECT billing.*,
           RANK() OVER ( PARTITION BY 1 ORDER BY sku_amount DESC ) rnk
    FROM   billing 
    ) TMP
 WHERE rnk <= 350
票数 1
EN

Stack Overflow用户

发布于 2019-07-20 06:53:44

您可以通过为CTE中的行提供一个CTE,并使用row_number小于或等于350的行来实现这一点。

查询

代码语言:javascript
复制
;with cte as(
  select [rn] = row_number() over(
    partition by [sku_code]
    order by [amount] desc
  ), *
  from [bill]
)
select sum([sku_amount]) as [amount]
from cte
where [rn] <= 350;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57119727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档