添加排名字段并返回前3个数据

时间:2015-02-06 02:22:10

标签: sql sql-server sql-server-2008

你能帮我解决一下sql的问题吗?我想让我当前的表返回一个“排名”字段,该字段显示每天基于“销售计数”的前3个产品。

我的表

Date    Name    ProductName SellCount
1/2/2014    John    Product1    55
1/2/2014    John    Product4    55
1/2/2014    John    Product7    10
1/2/2014    John    Product10   100
1/3/2014    John    Product2    55
1/3/2014    John    Product5    77
1/3/2014    John    Product8    25
1/3/2014    John    Product11   50
1/4/2014    John    Product3    55
1/4/2014    John    Product6    5
1/4/2014    John    Product9    44
1/4/2014    John    Product12   660

我希望它返回“排名”字段。所以我可以看到每天销售的前3个产品。此外,如果有两个卖出计数相等于彼此(例如“等级”字段日期“1/2/2014”):我希望它自动将等级中的一个分配为2而另一个为3。

Date    Name    ProductName  SellCount  Rank
1/2/2014    John    Product1    55  3
1/2/2014    John    Product4    55  2
1/2/2014    John    Product10   100 1
1/3/2014    John    Product11   50  3
1/3/2014    John    Product2    55  2
1/3/2014    John    Product5    77  1
1/4/2014    John    Product9    44  3
1/4/2014    John    Product3    55  2
1/4/2014    John    Product12   660 1

我希望我的问题足够明确。如果你们需要我详细说明,请告诉我。我很感激SQL格式的解决方案。谢谢大家!

第2部分问题: 伙计如果我添加另一个列呼叫组

,该怎么办?

我的新表是

       Date Name    Group          ProductName  SellCount
1/2/2014    John    BigGroup1A  Product7    10
1/2/2014    John    BigGroup1A  Product10   100
1/2/2014    John    BigGroup1B  Product2    55
1/2/2014    John    Group1A         Product1    55
1/3/2014    John    Group1B         Product6    5
1/3/2014    John    Group1C         Product9    44
1/3/2014    John    Group1C         Product4    55
1/3/2014    John    LargeGroup1A    Product5    77
1/4/2014    John    LargeGroup2A    Product8    25
1/5/2014    John    LargeGroup2B    Product12   660
1/6/2014    John    MediumGroup2A   Product11   50
1/7/2014    John    MediumGroup2A   Product3    55

(我添加了一个名为group的新列,我希望它返回排名,并根据“Date”,“Group”,“Sell Count”进行排名,因此它可以给出前3的排名。例如1 / 2/2014 John在“BIGGroup1A”中售出100和10.因此,产品10中的等级为1,产品7中的等级为2.在2014年1月1日的同一天,他在两个不同的组中出售55和55他们都应该是1.我填补了排名的其余部分,以匹配我追求的逻辑。

Date    Name    Group          ProductName  SellCount   Rank
1/2/2014    John    BigGroup1A  Product7    10           2
1/2/2014    John    BigGroup1A  Product10   100          1
1/2/2014    John    BigGroup1B  Product2    55           1
1/2/2014    John    Group1A         Product1    55           1
1/3/2014    John    Group1B         Product6    5            1
1/3/2014    John    Group1C         Product9    44           2
1/3/2014    John    Group1C         Product4    55           1
1/3/2014    John    LargeGroup1A    Product5    77           1
1/4/2014    John    LargeGroup2A    Product8    25           1
1/5/2014    John    LargeGroup2B    Product12   660          1
1/6/2014    John    MediumGroup2A   Product11   50           2
1/7/2014    John    MediumGroup2A   Product3    55           1

再次感谢!帮助我找到第二部分的解决方案。

2 个答案:

答案 0 :(得分:2)

将窗口函数与CTE一起用于此类问题:

CREATE TABLE #Temp(
    [Date]      DATE,
    Name        VARCHAR(20),
    ProductName VARCHAR(20),
    SellCount   INT
)
INSERT INTO #Temp VALUES
('1/2/2014', 'John', 'Product1', 55), ('1/2/2014', 'John', 'Product4', 55), ('1/2/2014', 'John', 'Product7', 10),
('1/2/2014', 'John', 'Product10', 100), ('1/3/2014', 'John', 'Product2', 55), ('1/3/2014', 'John', 'Product5', 77),
('1/3/2014', 'John', 'Product8', 25), ('1/3/2014', 'John', 'Product11', 50), ('1/4/2014', 'John', 'Product3', 55),
('1/4/2014', 'John', 'Product6', 5), ('1/4/2014', 'John', 'Product9', 44), ('1/4/2014', 'John', 'Product12', 660);

--Start of the solution
;WITH CTE AS(
    SELECT
        *,
        [Rank] = ROW_NUMBER() OVER(PARTITION BY Name, [Date] ORDER BY SellCount DESC)
    FROM #Temp --Replace this with your Table
)
SELECT * 
FROM CTE 
WHERE [Rank] <= 3
ORDER BY [Date], [Rank] DESC
--End of the solution    

DROP TABLE #Temp

<强> RESULT

Date       Name                 ProductName          SellCount   Rank
---------- -------------------- -------------------- ----------- --------------------
2014-01-02 John                 Product4             55          3
2014-01-02 John                 Product1             55          2
2014-01-02 John                 Product10            100         1
2014-01-03 John                 Product11            50          3
2014-01-03 John                 Product2             55          2
2014-01-03 John                 Product5             77          1
2014-01-04 John                 Product9             44          3
2014-01-04 John                 Product3             55          2
2014-01-04 John                 Product12            660         1

答案 1 :(得分:0)

在Sql Server中查看这些窗口函数我相信它会满足您的需求。

DENSE_RANK - 返回结果集分区内的行级别,排名中没有任何间隙。行的等级是一行加上有关行之前的不同等级的数量。

RANK - 返回结果集分区中每行的排名。行的等级是一行加上有关行之前的等级数。

ROW_NUMBER - 返回结果集分区中行的序号,从1开始,每个分区的第一行。

Other Sql Server Ranking Functions