根据最近7天的日期查询前3名已售完产品的SQL
我要上星期卖完的前三名产品 这是我的sql查询根据最近7天的日期查询前3名已售完产品的SQL,sql,sql-server,Sql,Sql Server,我要上星期卖完的前三名产品 这是我的sql查询 select ProductId,sum(Quantity) as quantity,createdOn from (SELECT inv.Id,invd.ProductId, invd.Quantity ,cast (inv.CreatedOn as date) as createdOn FROM Invoice as inv INNER JOIN InvoiceDetail invd ON invd.InvoiceId = inv
select ProductId,sum(Quantity) as quantity,createdOn from
(SELECT inv.Id,invd.ProductId, invd.Quantity ,cast (inv.CreatedOn as date) as createdOn FROM Invoice as inv
INNER JOIN
InvoiceDetail invd
ON
invd.InvoiceId = inv.id
WHERE inv.CreatedOn >= DATEADD(day,-11117, GETDATE()) ) as tbl
group by createdOn , ProductId
ORDER BY createdOn DESC
但我并没有在每次约会中获得前三名的产品。如果我使用TOP 3,那么它将只提供TOP 3产品,而我希望上周每天提供TOP 3产品
这是我最讨厌的但我每天只想要3张唱片。
预期产出:
如果我理解正确,您可以使用
行编号
获得每天前三名的数量
根据createdon
每天根据quantity
列从高到低的顺序生成行号
;WITH CTE AS(
SELECT productid,quantity,createdon,Row_number() over(partition by createdon ORDER BY quantity DESC,productid DESC) as RN
FROM
(
SELECT invd.productid,
sum(invd.quantity) as quantity,
cast(inv.createdon AS date) AS createdon
FROM invoice AS inv INNER JOIN invoicedetail invd
ON invd.invoiceid = inv.id
WHERE inv.createdon >= dateadd(day,-11117, getdate())
GROUP BY cast(inv.createdon AS date), invd.productid
) AS tbl
)
SELECT *
FROM CTE
WHERE RN <= 3
top
用于sqlserver
,请保持标签正确!你能提供一些样本数据和预期结果吗?我提供了那个查询的结果。在ProductId
中有许多相同的数量
,你预期的结果是什么?没有得到预期的结果!它只是在productId的基础上对输出重新排序。@Aarsh我编辑了我的答案并添加了一些SQLFIDLE,希望能帮助您:)
| productID | quantity | createdon | rn |
|-----------|----------|------------|----|
| 94 | 7 | 2018-07-25 | 1 |
| 1119 | 2 | 2018-07-25 | 2 |
| 1115 | 2 | 2018-07-25 | 3 |
| 94 | 4 | 2018-07-26 | 1 |
| 1117 | 2 | 2018-07-26 | 2 |
| 1114 | 2 | 2018-07-26 | 3 |