按日期和数量排名 SQL
Rank by Date and Qty in SQL
我有一个名为 SALES
的 table,还有 Person
、Date
和 Qty
。
Person Date Qty
Jim 2016-08-01 1
Jim 2016-08-02 3
Jim 2016-08-03 1
Bob 2016-08-01 5
Bob 2016-08-02 1
Bob 2016-08-03 6
Sheila 2016-08-01 4
Sheila 2016-08-02 0
Sheila 2016-08-03 2
我希望按每个日期的数量进行排名,输出如下:
Person Date Qty Rank
Bob 2016-08-01 5 1
Sheila 2016-08-01 4 2
Jim 2016-08-01 1 3
Jim 2016-08-02 3 1
Bob 2016-08-02 1 2
Sheila 2016-08-02 0 3
Bob 2016-08-03 6 1
Sheila 2016-08-03 2 2
Jim 2016-08-03 1 3
如何使用此处的排名功能?
试试这个
DECLARE @SALES TABLE(
Person NVARCHAR(50),
[Date] NVARCHAR(50),
Qty INT
)
INSERT INTO @SALES VALUES('Jim','2016-08-01',1)
INSERT INTO @SALES VALUES('Jim','2016-08-02',3)
INSERT INTO @SALES VALUES('Jim','2016-08-03',1)
INSERT INTO @SALES VALUES('Bob','2016-08-01',5)
INSERT INTO @SALES VALUES('Bob','2016-08-02',1)
INSERT INTO @SALES VALUES('Bob','2016-08-03',6)
INSERT INTO @SALES VALUES('Sheila','2016-08-01',4)
INSERT INTO @SALES VALUES('Sheila','2016-08-02',0)
INSERT INTO @SALES VALUES('Sheila','2016-08-03',2)
SELECT * ,
ROW_NUMBER() OVER( PARTITION BY [Date]
ORDER BY Qty DESC) N'Rank'
FROM @SALES
GROUP BY [Date], Person, Qty
ORDER BY [Date] ASC,Qty DESC
结果
==============================================
更新:select每天前 2 名
SELECT *
FROM(
SELECT * ,
ROW_NUMBER() OVER( PARTITION BY [Date]
ORDER BY Qty DESC) N'Rank'
FROM @SALES
GROUP BY [Date], Person, Qty
) AS NewTable
WHERE NewTable.Rank < 3
结果
注意:
不能直接使用WHERE Rank < 3
,因为WHERE
子句在SELECT
语句之前,WHERE
子句不能识别Rank
列。你必须使用子查询。
我有一个名为 SALES
的 table,还有 Person
、Date
和 Qty
。
Person Date Qty
Jim 2016-08-01 1
Jim 2016-08-02 3
Jim 2016-08-03 1
Bob 2016-08-01 5
Bob 2016-08-02 1
Bob 2016-08-03 6
Sheila 2016-08-01 4
Sheila 2016-08-02 0
Sheila 2016-08-03 2
我希望按每个日期的数量进行排名,输出如下:
Person Date Qty Rank
Bob 2016-08-01 5 1
Sheila 2016-08-01 4 2
Jim 2016-08-01 1 3
Jim 2016-08-02 3 1
Bob 2016-08-02 1 2
Sheila 2016-08-02 0 3
Bob 2016-08-03 6 1
Sheila 2016-08-03 2 2
Jim 2016-08-03 1 3
如何使用此处的排名功能?
试试这个
DECLARE @SALES TABLE(
Person NVARCHAR(50),
[Date] NVARCHAR(50),
Qty INT
)
INSERT INTO @SALES VALUES('Jim','2016-08-01',1)
INSERT INTO @SALES VALUES('Jim','2016-08-02',3)
INSERT INTO @SALES VALUES('Jim','2016-08-03',1)
INSERT INTO @SALES VALUES('Bob','2016-08-01',5)
INSERT INTO @SALES VALUES('Bob','2016-08-02',1)
INSERT INTO @SALES VALUES('Bob','2016-08-03',6)
INSERT INTO @SALES VALUES('Sheila','2016-08-01',4)
INSERT INTO @SALES VALUES('Sheila','2016-08-02',0)
INSERT INTO @SALES VALUES('Sheila','2016-08-03',2)
SELECT * ,
ROW_NUMBER() OVER( PARTITION BY [Date]
ORDER BY Qty DESC) N'Rank'
FROM @SALES
GROUP BY [Date], Person, Qty
ORDER BY [Date] ASC,Qty DESC
结果
==============================================
更新:select每天前 2 名
SELECT *
FROM(
SELECT * ,
ROW_NUMBER() OVER( PARTITION BY [Date]
ORDER BY Qty DESC) N'Rank'
FROM @SALES
GROUP BY [Date], Person, Qty
) AS NewTable
WHERE NewTable.Rank < 3
结果
注意:
不能直接使用WHERE Rank < 3
,因为WHERE
子句在SELECT
语句之前,WHERE
子句不能识别Rank
列。你必须使用子查询。