2017-05-29 45 views
1

我在SQL Server下表“卡恩”DENSE_RANK在SQL

carID  ownerID  Make  Model   Year  Color 
    C11   O11   Honda  A   2010  Red  
    C12   blue  Honda  B   2012  Blue  
    C13   O12   Maru  B   2014  Yellow  
    C12   blue  Honda  B   2012  Blue 
当我执行查询

select *,dense_Rank() over(partition by model order by carid) 
from carN 

carID  ownerID  Make  Model   Year  Color  Rank 
C11   O11   Honda  A   2010  Red   1 
C12   blue  Honda  B   2012  Blue  1 
C12   blue  Honda  B   2012  Blue  1 
C13   O12   Maru  B   2014  Yellow  2 

在结果是怎么发生的,以获得相同数量

“1”前三个记录?

+1

我很困惑。你的问题是什么?它是分配“1”,因为这是你的查询指定的 - 不知道哪个列是哪个列,很难提供更多的细节。你想要完成什么? –

+0

@GordonLinoff希望现在清楚 – user1357872

+0

你想知道排名函数的密集程度吗? –

回答

1

密集秩的工作方式是象下面这样:

  1. 由子句分区第一分区;这是model。因此,这里有两个分区,因为有两种型号

分区1

carID  ownerID  Make  Model   Year  Color 
C11   O11   Honda  A   2010  Red 

分区2

carID  ownerID  Make  Model   Year  Color  
C12   blue  Honda  B   2012  Blue  
C13   O12   Maru  B   2014  Yellow  
C12   blue  Honda  B   2012  Blue 
  • 在每个分区按顺序排列的排序顺序是carID。请注意,在分区2,因为两个记录有他们也将获得相同的等级相同carID,由于car12car13这里默认顺序为ASC小于价值,所以用car12都记录有相同等级为1
  • 分区1

    carID  ownerID  Make  Model   Year  Color rank 
    C11   O11   Honda  A   2010  Red  1 as it is the only record 
    

    分区2

    carID  ownerID  Make  Model   Year  Color rank 
    C12   blue  Honda  B   2012  Blue  1 
    C13   O12   Maru  B   2014  Yellow 2 
    C12   blue  Honda  B   2012  Blue  1 
    
    1. 现在将所有分区整理到一起以获取您看到的输出。
    1

    让我们分区的数据设置为根据您的SQL语句:

    dense_Rank() over(partition by model order by carid) 
    
    Model  carID  Rank 
        A   C11   1 
        ------------------------- 
        B   C12   1 
        B   C12   1 
        B   C13   2 
    

    第一个分区(A型)只有1行,以便Rank = 1

    第二分区的第一个两行有同样的carID,所以他们都有Rank = 1。如果你想让他们拥有不同的排名,可以加一个打破平局或使用ROW_NUMBER

    -- this will still give the same rank when the tie-breaker column is equal 
    dense_Rank() over(partition by model order by carid, AnotherColumn) 
    
    
    -- guaranteed to give different ranking for each row with a partition 
    -- if the rows have the same carID, which row gets what number is undetermined 
    ROW_NUMBER() over(partition by model order by carid)