SQL Server分区或任何其他技术

时间:2015-07-15 04:43:49

标签: sql asp.net sql-server-2012

在SQL Server 2012中:

||

我需要像这样生成最后一列,因为这些数据将按日期排序,现在我想按照它们的顺序区分ID。

如果没有这个ID RANK 5400 1 5400 1 5400 1 2587 2 2587 2 1200 3 1200 3 1200 3 1200 3 列我不能这样做,我想是这样的,因为当我在ID列上区分时,它在内部按ID升序排序

注意:我的ID列是主键

预期结果集:

RANK

当前结果集:

5400
2587
1200

2 个答案:

答案 0 :(得分:0)

在我看来,目前还不清楚你在问什么 您的预期结果集没有排名列 为什么你想首先拥有row_number / dense_rank?
您只能按ID对其进行分组,并按ID降序排序。
这不需要排名,也不是一个明显的排名:

SELECT ID FROM TABLE_NAME 
GROUP BY ID 
ORDER BY ID DESC 

此外,您声称您的ID列是主键,但它具有重复项,这意味着它不是主键,因为主键是定义唯一键。

我的结论是你输入的set是id为主键的表,与存储过程或表值函数中的其他表连接,你不知道“ group by“存在,并且您不知道可以通过指定ASC / DESC关键字来指定排序方向。

顺便说一句,如果您需要的值多于ID,您需要将它们放入组中,或者您需要使用聚合函数,例如

SELECT ID, Product_Name, MAX(Price) FROM TABLE_NAME 
GROUP BY ID, Product_Name 
ORDER BY ID DESC 

如果你以某种方式使用dense_rank,请小心,因为这会产生将NULL值计为不同值的效果。示例:

;WITH CTE AS 
(
              SELECT 1 AS Id 
    UNION ALL SELECT 2 AS Id 
    UNION ALL SELECT 3 AS Id 
    UNION ALL SELECT 3 AS Id 
    UNION ALL SELECT 3 AS Id 
    UNION ALL SELECT 3 AS Id 
    UNION ALL SELECT 4 AS Id 
    UNION ALL SELECT 5 AS Id 
    UNION ALL SELECT NULL AS Id 
)

SELECT 
     Id
    ,DENSE_RANK() OVER (ORDER BY Id) AS rank
FROM CTE 

ORDER BY rank DESC  

答案 1 :(得分:-2)

请检查以下答案。

declare @Temp table (id1 bigint identity(1, 1), Type int)

insert into @Temp
select 5400  union all
select 5400  union all
select 4500  union all
select 4500  union all
select 1800  union all
select 3200  union all
select 1800  union all
select 200  union all
select 3200

现在,下面是您获得排名的查询。

select 
DENSE_RANK()OVER(ORDER BY Type DESC) AS 'RANKNumber', Type from @Temp
group by Type