【问题标题】:RANK, ROW_NUMBER on T-SQLT-SQL 上的 RANK、ROW_NUMBER
【发布时间】:2018-04-12 09:25:19
【问题描述】:

我在 SQL Server 2014 中有这样的行:

id | fld1
---+-----
1  | 100
2  | 100
3  | 80
4  | 102
5  | 100
6  | 80
7  | 102

我需要一个 partition 在不改变顺序的情况下会返回:

  NewFld | id | fld1
  -------+----+------
   1     | 1  | 100
   1     | 2  | 100
   2     | 3  | 80
   3     | 4  | 102
   1     | 5  | 100
   2     | 6  | 80
   3     | 7  | 102

Newfld 应该根据fld1 返回相同的值,而不改变id 给出的顺序。

我尝试使用 ROW_NUMBERRANKDENSE_RANK,但没有任何效果。

查看this fiddle

【问题讨论】:

  • 那么,对于任何特定的fld1 值,如果您获得该值的MIN(id) 值,并为这些不同的值分配行号,您会得到您需要的结果吗?跨度>
  • 您的问题现在解决了吗?您对这些答案还有疑问吗?要接受答案“Click the Tick”了解更多信息,请参阅help/accepting

标签: sql sql-server rank row-number dense-rank


【解决方案1】:

你可以用这个

with mytab as 
(
SELECT * 
  ,(SELECT MIN(ID) FROM yourtable sub where sub.fld1 = yourtable.fld1) as ranks
FROM yourtable

 )

 SELECT ID ,fld1 , DENSE_RANK()OVER(ORDER BY Ranks)
 FROM mytab
 ORDER BY ID

查看this fiddle

【讨论】:

    【解决方案2】:

    在子查询中使用min() over() 来确定@​​987654323@ 所需的排序值。

    SELECT id
         , Fld1
         , DENSE_RANK() OVER (order by fld1_idmin) AS Rank
    FROM (
           SELECT id
                 , fld1
                     , Min (id) over (partition by fld1) fld1_idmin
               FROM yourtable
               ) d
        ORDER BY ID
    

    使用这些窗口函数在 FLD1 上建立索引只需要对该查询进行一次索引扫描。看到这个SQLfiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-13
      • 1970-01-01
      • 1970-01-01
      • 2016-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-06
      相关资源
      最近更新 更多