簡體   English   中英

帶有Case語句的Dense_Rank沒有給出帶有日期的排名

[英]Dense_Rank with Case statement is not giving Rank with Date

在CASE語句中使用Dense_Rank時遇到問題。 下面是示例表的屏幕截圖

在此處輸入圖片說明

所以我的要求是兩個基於Emp_Dep_id為每個員工提供一個排名

Req 1-->If Emp_Dep_id is same give same rank

Req 2-->If Emp_Dep_id is null then give same rank only when Emp_Joining_Date and Emp_Country is same

下面是賦予等級的代碼

 Select case  
    when  Emp.Emp_Dep_Id IS NULL   
    then   
  DENSE_RANK() over (order by  Emp.Emp_Dep_Id desc,
  Emp.Emp_Joining_Date desc,Emp.Emp_Country)  
   else  
    DENSE_RANK() over (order by Emp.Emp_Dep_Id desc)  
 end as   
 rnk ,*
 from Employee Emp with (nolock)

下面是輸出->

在此處輸入圖片說明

因此,我面臨兩個問題-

  1. 如果在第二名之后存在相同的名次,為什么要跳過名次?
  2. 我想給出Emp_Joining_Date的排名基礎目前,它的表現方式是,首先,如果Emp_Dep_Id不為null,則在為Emp_Dep_Id為null繼續分配排名。 我想根據最新的Emp_Joining_Date獲得排名,這意味着2016年加入null的日期應該排在首位

謝謝你們的寶貴答復,我通過這種方式解決了我的問題

 1. Step 1

    Select case  
    when  Emp.Emp_Dep_Id IS NULL   
    then   
    DENSE_RANK() over (order by  Emp.Emp_Joining_Date,Emp.Emp_Country)  
    else  
    DENSE_RANK() over (order by Emp.Emp_Dep_Id desc)  
    end as   
    rnk ,*
    into #Emp_Output_Tbl
    from Employee Emp 

   Select * from #Emp_Output_Tbl order by Emp_Joining_date desc


--Step 2

Select  distinct rnk,Emp_Joining_date into #Emp_New_Tbl  from #Emp_Output_Tbl order by Emp_Joining_date desc

Select * from #Emp_New_Tbl order by Emp_Joining_Date desc
Select * from #Emp_Output_Tbl order by Emp_Joining_Date desc

--Step 3

Select * from #Emp_Output_Tbl where rnk in(
Select TOP 5 rnk from #Emp_New_Tbl
)
order by Emp_Joining_Date desc

 **Output as per expectation**

在此處輸入圖片說明

我希望這會有所幫助

我認為您需要這種邏輯:您只需要一個dense_rank() 訣竅是將邏輯放入order by子句中。

我認為這是您想要的:

Select dense_rank() over (order by Emp.Emp_Dep_Id,
                                   (case when Emp.Emp_Dep_Id IS NULL then Emp.Emp_Joining_Date end) desc,
                                   (case when Emp.Emp_Dep_Id IS NULL then Emp.Emp_Country end) desc
                         )

密集排名根據結果集及其中的記錄數進行工作。 請參考給出的鏈接https://msdn.microsoft.com/en-IN/library/ms173825.aspx

使用以下查詢可以更好地了解結果。 還請嘗試在SQL語句后使用order by來正確排序。

Select 
DENSE_RANK() over (order by  Emp.Emp_Dep_Id desc,
  Emp.Emp_Joining_Date desc,Emp.Emp_Country),
DENSE_RANK() over (order by Emp.Emp_Dep_Id desc),
case  
    when  Emp.Emp_Dep_Id IS NULL   
    then   
  DENSE_RANK() over (order by  Emp.Emp_Dep_Id desc,
  Emp.Emp_Joining_Date desc,Emp.Emp_Country)  
   else  
    DENSE_RANK() over (order by Emp.Emp_Dep_Id desc)  
 end as   
 rnk ,*
 from Employee Emp with (nolock)

能否滿足您的要求,請使用以下查詢。 我相信密集范圍將按您的要求進行操作。 您不需要添加額外的case語句。 您只需指定列的順序即可。 它會根據您的需要自動處理。

 Select    
  DENSE_RANK() over (order by  Emp.Emp_Dep_Id desc,Emp.Emp_Joining_Date desc,Emp.Emp_Country)  as  rnk ,*
 from Employee Emp with (nolock)

需求1->如果Emp_Dep_id相同則給出相同的等級

要求2->如果Emp_Dep_id為null,則僅當Emp_Joining_Date和Emp_Country相同時才給出相同的等級

Thanks Guys for your valuable response,I fixed my issue by doing this way

  1. Step 1

  Select case  
 when  Emp.Emp_Dep_Id IS NULL   
  then   
  DENSE_RANK() over (order by  Emp.Emp_Joining_Date,Emp.Emp_Country)  
  else  
  DENSE_RANK() over (order by Emp.Emp_Dep_Id desc)  
  end as   
  rnk ,*
  into #Emp_Output_Tbl
  from Employee Emp 

 Select * from #Emp_Output_Tbl order by Emp_Joining_date desc


--Step 2

Select  distinct rnk,Emp_Joining_date into #Emp_New_Tbl  from #Emp_Output_Tbl order by Emp_Joining_date desc

Select * from #Emp_New_Tbl order by Emp_Joining_Date desc
Select * from #Emp_Output_Tbl order by Emp_Joining_Date desc

--Step 3

  Select * from #Emp_Output_Tbl where rnk in(
  Select TOP 5 rnk from #Emp_New_Tbl
  )
   order by Emp_Joining_Date desc

 **Output as per expectation**

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM