2016-09-30 8 views
0

この問題の解決方法はインターネットで調べていますが、探しているものを正確に見つけることができません。優先度の高い複数の列に対して最小集計関数を使用するクエリ

私たちはこのようになりますテーブルを持っていることを言うことができます:

_____________________________________________________ 
| id (PK) | name | date  | ... other data ... | 
----------------------------------------------------- 
| 1 | BOB | 2016-11-20 |  .... 
--------------------------------  
| 3 | CARL | 2015-09-02 |  .... 
-------------------------------- 
| 4 | BOB | 2016-11-18 |  .... 
-------------------------------- 
| 5 | JON | 2016-03-03 |  .... 
-------------------------------- 
| 6 | TIM | 2016-11-24 |  .... 
-------------------------------- 
| 7 | TIM | 2016-11-24 |  .... 
-------------------------------- 
| 8 | JON | 2016-05-05 |  .... 
-------------------------------- 

私はその意志のクエリ必要があります。それぞれの
1.リターン名前の明確なリスト(個別の機能)
2.名前は最も早い日付(分の関数)を持っています
3.上記の2つの列になるID。
4.日付が同じであれば、そうこの場合、所望の結果は次のようになり

を選択するために、どの行を決定するための方法として分(ID)を使用し..

_____________________________________________________ 
| id (PK) | name | date | ... other data ... | 
----------------------------------------------------- 
| 3 | CARL | 2015-09-02 |  .... 
-------------------------------- 
| 4 | BOB | 2016-11-18 |  .... 
-------------------------------- 
| 5 | JON | 2016-03-03 |  .... 
-------------------------------- 
| 6 | TIM | 2016-11-24 |  .... 
-------------------------------- 

ありスクリプトを使用して一時テーブルを作成してループする必要なく、効率的にクエリを実行する方法がありますか?

これは私が道の半分を取得:
を明確な(名)、分(日付)、...他のデータをSELECT ... TABLE1


から、私はIDに分関数を適用する場合それは私が必要とするように行動しません。 BOBの場合は、2行をミックスし、 'id'の場合は1、日付の場合は '2016-11-18'を返します。これは完全に間違っています。

何か助けてください。

答えて

0
;WITH cte AS (
    SELECT * 
     ,ROW_NUMBER() OVER (PARTITION BY name ORDER BY Date, Id) as RowNum 
    FROM 
     @Table 
) 

SELECT * 
FROM 
    cte 
WHERE 
    RowNum = 1 

だからといって、それは少し違っていると思います。最初の日付行が名前ごとに必要です。したがって、日付昇順で注文した名前にpartitioned ROW_NUMBER()を作成し、次にROW_NUMBER() = 1を選択すると、回答が得られます。集約でこれを行う方法もあります。また、Timの場合と同じ日付の場合は、最初のIDが必要な場合は、順序でIDを追加することもできます。

1

SQL Server 2005以降のウィンドウ処理関数、およびrow_numberは、単独で使用できます。これと非常によく似たものが動作するはずです。

SELECT 
    name 
    ,date 
    ,id 
from (-- Can't reference the windowing function within it's own select, 
     -- so we make it a subquery 
     select 
      name 
     ,date 
     ,id 
     ,row_number() over (partition by name order by date, id) Ranking 
     from Table1 
    ) sub 
where Ranking = 1 
order by name 
関連する問題