按当前顺序排名

时间:2018-06-12 14:25:38

标签: sql sql-server

我有这样的表:

col1     | col2   
__________________
15077244 | 544648 
15077320 | 544648
15080285 | 544632
15382858 | 544648
15584221 | 544648
15584222 | 544648
15584223 | 544628
15584224 | 544628
15584225 | 544628
15584226 | 544628
15584227 | 544632
15584228 | 544632

我希望将其排名为col2值,如下例所示(这是我希望实现的):

col1     | col2   | rank 
________________________
15077244 | 544648 | 1
15077320 | 544648 | 1
15080285 | 544632 | 2
15382858 | 544648 | 1
15584221 | 544648 | 1
15584222 | 544648 | 1
15584223 | 544628 | 3
15584224 | 544628 | 3
15584225 | 544628 | 3
15584226 | 544628 | 3
15584227 | 544632 | 2
15584228 | 544632 | 2

我找到了一个答案,建议我使用DENSE_RANK()函数。所以我用它:

SELECT col1, col2, DENSE_RANK() OVER(ORDER BY col2) as rank     
FROM myTable

但是当我使用它时它会改变col1的顺序,如下所示:

col1      | col2   |   rank
____________________________
15584223  | 544628 |    1
15584224  | 544628 |    1
15584225  | 544628 |    1
15584226  | 544628 |    1
15080285  | 544632 |    2
15584227  | 544632 |    2
15584228  | 544632 |    2
15077244  | 544648 |    3
15077320  | 544648 |    3
15382858  | 544648 |    3
15584221  | 544648 |    3
15584222  | 544648 |    3

现在当我在SELECT查询结束时使用ORDER BY(如ORDER BY col1)时,我的数据顺序正确但RANKS错误,因为例如col2值544648有RANK 3但它应该有RANK 1。

如何使用DENSE_RANK函数或其他不同的函数来帮助我在不更改数据顺序的情况下获取col2值?

3 个答案:

答案 0 :(得分:1)

您需要将dense_rank的订单更改为desc。并按col1 asc订购结果。

<强> Fiddle Demo

SELECT 
    col1
  , col2
  , DENSE_RANK() OVER(ORDER BY col2 DESC) as rank     
FROM myTable
ORDER BY col1 ASC

答案 1 :(得分:0)

虽然可能有一个更简单的解决方案,但这里有一种方法,使用带有email <- html_text(html_nodes(doc, xpath = "//a[@class = 'email']")) 的子查询来建立结果分组,按row_number排序:

min(col1)

答案 2 :(得分:0)

您可以使用具有窗口最小值的相关子查询。

;WITH CorrelatedDistinctCount AS
(
    SELECT
        D.col1,
        D.col2,
        (
            SELECT 
                COUNT(DISTINCT(X.col2))
            FROM
                Data X
            WHERE
                X.col1 <= D.col1) AS DistinctCol2Count
    FROM
        Data D
)
SELECT
    C.col1,
    C.col2,
    MIN(C.DistinctCol2Count) OVER (PARTITION BY C.col2) AS rank
FROM
    CorrelatedDistinctCount C
ORDER BY
    C.col1 ASC