使用SQL如何编写查询以查找每个类别每月前5名?

问题描述 投票:0回答:1

我试图在特定的时间间隔(例如一个月)中获得每个类别的最高编号的前5行。我目前所拥有的返回5个类别的完全相同的描述。我想要进入前五名。这只有在我尝试根据时间段对其进行排序时才会发生。

WITH CustomerRank
AS
(SELECT 
    Count(*) AS "Count",
    d.Item,
    d.Description,
    Name,
    i.Type,
    d.CreatedOn    
FROM [dbo].i,
    d,
    dbo.b,
    as,
    a,
    c
WHERE d.Inspection_Id = i.Id  AND d.Inspection_Id = i.Id AND 
    b.Id = i.BuildingPart_Id AND b.as= Assessments.Id
    AND as.Application_Id = a.Id AND a.Customer_Id = Customers.Id                                
group by d.Item, d.Description, Name, i.Type, d.CreatedOn

)

select * from (
    SELECT "Count",Item,Description,Type,ROW_NUMBER()  Over (PARTITION BY Name order by "Count" desc) AS RowNum, Name, CreatedOn
    FROM CustomerRank  
where CreatedOn > '2017-1-1 00:00:00'

) s where RowNum <6 

干杯

sql tsql
1个回答
0
投票

尝试这样的事情:

WITH CustomerRank
AS
(SELECT 
    Count(*) AS "Count",
    d.Item, d.Description, Name, i.Type
FROM dbo.Inspection i
INNER JOIN dbo.Details d ON d.Inspection_Id = i.Id
INNER JOIN dbo.BuildingParts b ON b.Id = i.BuildingPart_Id
INNER JOIN dbo.Assessments a ON a.Id = b.AssessmentId
INNER JOIN dbo.Applications ap ON ap.Id = a.Application_Id
INNER JOIN dbo.Customers c ON c.Id = a.Customer_Id
where CreatedOn > '2017-1-1 00:00:00'
group by d.Item, d.Description, Name, i.Type
)
select * from (
    SELECT "Count",Item,Description,Type,ROW_NUMBER()  Over (PARTITION BY Name order by "Count" desc) AS RowNum, Name
    FROM CustomerRank  
) s where RowNum <6 

这个想法是必须从CreatedOn子句中删除GROUP BY列(因为如果你保留它,我们将为CreatedOn列的每个值得到一个不同的行)。

此外,最好为每个表使用JOIN-s和别名。

© www.soinside.com 2019 - 2024. All rights reserved.