我有一张叫billing的桌子
sku_code | invoice_id | sku_amount | sku_sale
integer | integer | float | float我要做的是先找到sku_code的前350名,由sku_amount
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。
SELECT sum(sku_amount) as amt,sku_code, invoice_id
from billing
group by sku_code, invoice_id
order by amt DESC给我一个应该有2000万到3000万行的表。
amt | sku_code | invoice_id多谢你们的支持!
发布于 2019-07-20 00:18:07
如果我正确理解,您需要前350个skus的原始行。JOIN应该就足够了:
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发布于 2019-07-19 21:29:03
如果我理解得对的话,你可以直接用排名。这将提供所有在前350名中拥有sku_amount的记录。
SELECT *
FROM (
SELECT billing.*,
RANK() OVER ( PARTITION BY 1 ORDER BY sku_amount DESC ) rnk
FROM billing
) TMP
WHERE rnk <= 350发布于 2019-07-20 06:53:44
您可以通过为CTE中的行提供一个CTE,并使用row_number小于或等于350的行来实现这一点。
查询
;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;https://stackoverflow.com/questions/57119727
复制相似问题