Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 添加排名字段并根据条件返回前3名数据库_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql 添加排名字段并根据条件返回前3名数据库

Sql 添加排名字段并根据条件返回前3名数据库,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,谢谢你调查我的问题 我希望它返回的排名,并有它的基础上的日期,组,销售计数,以便它可以给排名前3名。例如,2014年1月2日,BIGGroup1A中的John分别卖出100和10。因此,在产品10中排名为1,在产品7中排名为2。在2014年1月2日的同一天,他将55和55分为两个不同的组出售,因此它们都应该是1。我填补了排名的其余部分,以符合我所追求的逻辑 我的桌子是 Date Name Group ProductName SellCount 1/2/2014

谢谢你调查我的问题

我希望它返回的排名,并有它的基础上的日期,组,销售计数,以便它可以给排名前3名。例如,2014年1月2日,BIGGroup1A中的John分别卖出100和10。因此,在产品10中排名为1,在产品7中排名为2。在2014年1月2日的同一天,他将55和55分为两个不同的组出售,因此它们都应该是1。我填补了排名的其余部分,以符合我所追求的逻辑

我的桌子是

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
我希望结果是:

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           1
1/7/2014    John    MediumGroup2A   Product3    55           1
我很欣赏sql中的解决方案,我是新手,希望每个人都能提供帮助。

你可以使用RANK来实现你想要的

Select *, 
RANK() OVER (PARTITION BY DATE,GROUP ORDER BY SELLCOUNT)AS RANK 
from Table T

PARTITION BY根据日期和组将结果集划分为多个组。ORDER BY确保排名基于所创建组中的SELLCOUNT

您应该能够像这样使用排名窗口功能:

select * from (
  select 
    *,
    rank = rank() over (partition by date, [group] order by date, [group], sellcount desc)
  from table1
) t 
where rank <= 3
内部查询根据您的规范为每一行分配一个等级,外部查询过滤等级大于3的行


请参见示例。

SQL Server 2008有一个排名函数。2014年6月1日的行不应该有排名1,因为它是当天唯一的项目吗?是的,你说得对。我刚刚编辑了它。我尝试了SQL,所有内容都返回排名1。是否有其他函数或过滤器可以在我上面提供的数据库字段中为我提供结果?谢谢你的帮助help@Nguyenal07此排名函数将根据partition子句将数据分为多个组,因此,只要一个组中有多个具有不同sellcount的项目,这些项目就应该获得不同的排名。你确定这些项目不同吗?看看示例SQL Fiddle,它给出了不同的等级。它不起作用,因为如果我在同一天有3个销售计数,其中两个是55,它会将两者都标记为2。如果一个是二,另一个是三,我如何让他们自动分配?例如,它看起来是这样的:销售计数3排名2,销售计数3排名2,销售计数20,排名1-@jpw@Nguyenal07我不确定我是否理解,但是如果您想要的是返回四行,列号为1、2、2,3如果两个产品具有相同的值,那么您可能希望使用密集等级。看看这个例子,我为BigGroup1B更改了产品:谢谢!这就是我想要的,也许我需要添加另一个标准,现在就应该这样做了。我感谢你的帮助