2017-02-22 21 views
0
LN_NUMBER  RUN_DATE SALE_DATE STATUS_CODE TYPE PROCESSOR_ID  
------------------------------------------------------------------------ 
0201203909  02/21/17 09/30/15  R 1  TG1   
0201203909  02/21/17     R 2  TG1  
0201203909  02/21/17     A 1  MW1 -------choose this row for LN_number 0201203909 
0201105919  02/21/17 08/24/16  S 2  MW1 ---choose this row for LN_number 0201105919 
0201105919  02/21/17 08/24/16  S 2  MW1 
0201105919  02/21/17 07/01/15  R 2  TG1 
1400000138  02/21/17-----------------------------------------------------------Choose this for LN_NUMBER 1400000138 

我有一個名爲closure的表,如上所示。我需要從閉合表中選擇記錄。多種方式訂購排名函數SQL Server 2014

的條件是這樣的:

  • 如果有一個狀態碼= A,然後選擇該行(使它作爲ROWNUM = 1)。
  • 如果狀態碼不是A,則選擇最近SALE_DATE的記錄(使其成爲RowNum = 1)。

我想這個代碼

SELECT 
    [LN_NUMBER], 
    [RUN_DATE] , 
    [SALE_DATE], 
    [STATUS_CODE], 
    [TYPE], 
    [PROCESSOR_ID], 
    ROW_NUMBER() OVER (partition by [LN_NUMBER] order by 
        case when [STATUS_CODE]='A' then [STATUS_CODE] end asc, 
        case when [STATUS_CODE]!='A' then CONVERT(DATE,[SALE_DATE]) end desc)    
       as 'RowNum' 
FROM [dbo].[Closure ] 

此代碼爲LN_NUMBER = 0201105919做工精細。但對於LN_NUMBER = 0201203909,我沒有以所需的方式獲取rowNum。

這是我得到的結果:

LN_NUMBER RUN_DATE SALE_DATE STATUS_CODE TYPE PROCESSOR_ID RowNum 
0201203909 02/21/17 09/30/15  R   1  TG1   1 
0201203909 02/21/17    R   2  TG1   2 
0201203909 02/21/17    A   1  MW1   3 
0201105919 02/21/17 08/24/16  S   2  MW1   1 
0201105919 02/21/17 08/24/16  S   2  MW1   2 
0201105919 02/21/17 07/01/15  R   2  TG1   3 

任何人都可以請幫我this.I正在使用SQL Server 2014非常感謝您的寶貴時間,並幫助

+1

什麼,如果有多個行與狀態'A'?如何處理sale_date中的空值? –

+0

@vkp我們只需要選擇一行。 – Please

+0

好的,你只需要選擇一行。你如何打破領帶? – Paparazzi

回答

2
select 
    [LN_NUMBER], 
    [RUN_DATE] , 
    [SALE_DATE], 
    [STATUS_CODE], 
    [TYPE], 
    [PROCESSOR_ID], 
    ROW_NUMBER() over (
    partition by [LN_NUMBER] 
    order by case when [STATUS_CODE]='A' then 0 else 1 end asc 
     , CONVERT(DATE,[SALE_DATE]) desc 
) as 'RowNum' 
FROM [dbo].[Closure] 

測試設置:http://rextester.com/FNRE71956

create table Closure ( 
    LN_NUMBER varchar(10) 
    , RUN_DATE varchar(10) 
    , SALE_DATE varchar(10) 
    , STATUS_CODE char(1) 
    , TYPE int 
    , PROCESSOR_ID char(3) 
) 
insert into t values 
('0201203909','02/21/17','09/30/15','R',1,'TG1') 
,('0201203909','02/21/17','  ','R',2,'TG1') 
,('0201203909','02/21/17','  ','A',1,'MW1') 
,('0201105919','02/21/17','08/24/16','S',2,'MW1') 
,('0201105919','02/21/17','08/24/16','S',2,'MW1') 
,('0201105919','02/21/17','07/01/15','R',2,'TG1') 

查詢:

select 
    [LN_NUMBER], 
    [RUN_DATE] , 
    [SALE_DATE], 
    [STATUS_CODE], 
    [TYPE], 
    [PROCESSOR_ID], 
    ROW_NUMBER() over (
    partition by [LN_NUMBER] 
    order by case when [STATUS_CODE]='A' then 0 else 1 end asc 
     , CONVERT(DATE,[SALE_DATE]) desc 
) as 'RowNum' 
FROM [dbo].[Closure] 

結果:

+------------+----------+-----------+-------------+------+--------------+--------+ 
| LN_NUMBER | RUN_DATE | SALE_DATE | STATUS_CODE | TYPE | PROCESSOR_ID | RowNum | 
+------------+----------+-----------+-------------+------+--------------+--------+ 
| 0201105919 | 02/21/17 | 08/24/16 | S   | 2 | MW1   |  1 | 
| 0201105919 | 02/21/17 | 08/24/16 | S   | 2 | MW1   |  2 | 
| 0201105919 | 02/21/17 | 07/01/15 | R   | 2 | TG1   |  3 | 
| 0201203909 | 02/21/17 |   | A   | 1 | MW1   |  1 | 
| 0201203909 | 02/21/17 | 09/30/15 | R   | 1 | TG1   |  2 | 
| 0201203909 | 02/21/17 |   | R   | 2 | TG1   |  3 | 
+------------+----------+-----------+-------------+------+--------------+--------+ 
+0

非常感謝。它正在工作。非常感謝 – Please

+0

@請高興幫忙! – SqlZim