11

大量の行 (>10K) を持つテーブルがあります。ほとんどの行には、ユーザー名に関連付けられたロール値が重複しています。

私がやろうとしているのは、 request_idによって追加された個別の AND 最新のロールによって行を選択することです。私はほとんどそれを持っていますが、私の尻尾を蹴っている部分は、その列が追加される前にそれらの要求が行われたため、いくつかのrequest_idフィールドに値があることです. 更新以降、ユーザーが別のリクエストを入力していない場合に備えて、それらを含める必要がありますnullselect statement

ここに私のテーブル構造の例があります:

 id | uname  | role    | request_id
 0  | jsmith  | User   | null
 1  | jsmith  | Admin   | null
 2  | jsmith  | Dude    | null
 3  | jsmith  | Admin   | 56
 4  | jsmith  | Dude    | 56
 5  | jsmith  | Admin   | 57
 6  | jsmith  | Dude    | 57

これは望ましい結果です。

0  | jsmith  | User    | null
5  | jsmith  | Admin   | 57
6  | jsmith  | Dude    | 57

これまでに試したステートメントは次のとおりです。

加入

select distinct a.uname, a.role, a.request_id from (
    select * from  das_table 
    ) 
b join das_table a on b.role = a.role and b.request_id = a.request_id
where a.uname = 'jsmith'

結果:これにより、 request_id =の行が削除されますNULL

MAX()

MAX()値をカウントしないため、これはうまくいきませんでしたnullか?

select distinct uname, role, max(request_id) as request_id from das_table where uname='jsmith'
group by uname, role, request_id

私が見た同様の質問:

私が調査した他の質問とは異なると思う私の質問の1つの注意点は、request_idnullになる可能性があることです。

1 列から個別の値を選択| SQL Server : 1 つの列と別の列の値で個別に選択する| SQL Server は異なる地獄を選択します

4

2 に答える 2

17

グループに含めたため、クエリは機能しませんでした - 試してくださいmax:request_id

select distinct uname, role, max(request_id) as request_id 
from das_table where uname='jsmith'
group by uname, role

ここでSQLFiddle 。

于 2013-06-06T15:52:00.990 に答える
1

ISNULL はあなたの問題を解決するようです。ここでは簡単にするために 1 を使用しますが、使用法により意味がある場合は -1 を使用できます。

MAX(ISNULL(request_id, 1))
于 2013-06-06T15:45:11.943 に答える