0

以下のような表があります
。max(account_opened_date)を見つけたいのですが、nullの日付が存在する場合は、nullの値を表示する必要があります。

シナリオ1

表1

CLIENTID            ACCOUNTID           ACCOUNT_OPENED_DATE
11562               3880                07/05/2012
11562               3884                08/05/2012
11562               3885                09/06/2012
11562               3886                10/06/2012
11562               3881                NULL
11562               3882                NULL  

結果は以下のとおりです。

CLIENTID            ACCOUNTID           ACCOUNT_OPENED_DATE  
11562               3882                NULL  

上記のシナリオでは、アカウントの開設日にnull値が存在するため、nullを取る必要があります

シナリオ2

表1

CLIENTID            ACCOUNTID           ACCOUNT_OPENED_DATE  
11563               3880                07/05/2012
11563               3884                08/05/2012
11563               3885                09/06/2012
11563               3886                10/06/2012
11563               3881                11/10/2011
11563               3882                10/22/2012  

結果は以下のとおりです。

CLIENTID            ACCOUNTID           ACCOUNT_OPENED_DATE
11563               3882                10/22/2012  

上記のシナリオでは、アカウントの開設日にnull値が存在しないため、2012年10月22日を取る必要があります
。助けてください!

4

2 に答える 2

2

TOP 11 つのレコードを取得することを選択しORDER BY CASE、「null-first」要件を選択できます。

SELECT TOP 1 CLIENTID, ACCOUNTID, ACCOUNT_OPENED_DATE
FROM dbo.Table
ORDER BY CASE WHEN ACCOUNT_OPENED_DATE IS NULL THEN 0 ELSE 1 END ASC
  , ACCOUNT_OPENED_DATE DESC
  , ACCOUNTID DESC        
于 2012-10-22T20:19:32.180 に答える
1

これを試して

SELECT * FROM (
SELECT CLIENTID, ACCOUNTID, ACCOUNT_OPENED_DATE, 
ROW_NUMBER() OVER (partition by clientid 
             ORDER BY CASE WHEN ACCOUNT_OPENED_DATE IS NULL THEN '12/31/9999' 
                      ELSE ACCOUNT_OPENED_DATE END DESC) opened_date_rank
FROM dbo.Table1
) v WHERE opened_date_rank = 1 

例:

declare @table table (clientid int, accountid int, opened_date date)
insert into @table 
select 11562, 3880, '07/05/2012' UNION ALL
select 11562,3884, '08/05/2012' UNION ALL
select 11562,3882, null UNION ALL
select 11563,3880, '07/05/2012' UNION ALL
select 11563,3884, '08/05/2012' UNION ALL
select 11563,3882,'10/22/2012'



SELECT * FROM (
SELECT clientid, accountid, opened_date, 
row_number() over (partition by clientid 
             ORDER BY CASE WHEN opened_date IS NULL THEN '12/31/9999' 
                      ELSE opened_date END DESC) opened_date_rank
FROM @table
) v where opened_date_rank = 1 
于 2012-10-22T20:28:20.647 に答える