2

Scr が 0 に等しくない最高の Seq から、各ユーザーに Scr を与える SQL クエリを探しています。Seq 値が各ユーザーに対して一意であることが保証されています。

サンプルデータ:

ID Cde User Scr Seq
1 1 ジェームス 110 19
2 1 ジェームス 85 20
3 1 ジェームス 99 21
4 1 ジェームス 99 22
5 1 ジェームス 0 23
6 2 アンドリュー 88 19
7 2 アンドリュー 88 20
8 2 アンドリュー 88 21
9 2 アンドリュー 0 22
10 2 アンドリュー 0 23
11 3 デビッド 0 19
12 3 デビッド 95 20
13 3 デビッド 95 21
14 3 デビッド 0 22
15 3 デビッド 0 23

クエリ結果:

ID Cde User Scr Seq
4 1 ジェームス 99 22
8 2 アンドリュー 88 21
13 3 デビッド 95 21
4

4 に答える 4

1
Declare @t table([ID] int, [Cde] int, [User] varchar(6), [Scr] int, [Seq] int);

INSERT INTO @t([ID], [Cde], [User], [Scr], [Seq])
VALUES
    (1, 1, 'James', 110, 19),
    (2, 1, 'James', 85, 20),
    (3, 1, 'James', 99, 21),
    (4, 1, 'James', 99, 22),
    (5, 1, 'James', 0, 23),
    (6, 2, 'Andrew', 88, 19),
    (7, 2, 'Andrew', 88, 20),
    (8, 2, 'Andrew', 88, 21),
    (9, 2, 'Andrew', 0, 22),
    (10, 2, 'Andrew', 0, 23),
    (11, 3, 'David', 0, 19),
    (12, 3, 'David', 95, 20),
    (13, 3, 'David', 95, 21),
    (14, 3, 'David', 0, 22),
    (15, 3, 'David', 0, 23);

Select [ID], [Cde], [User], [Scr], [Seq] From 
(Select Rn = Row_Number()Over(Partition By [User] Order By Seq Desc,[User]) , *
From @t 
Where Scr <> 0) x Where x.Rn = 1 Order By 5 Desc,3
于 2012-08-31T05:12:42.087 に答える
1

seqサブクエリ内で最大のものを見つけることができます。

SELECT  a.*
FROM    tableName a INNER JOIN
        (
            SELECT [user], max(seq) MaxSeq
            FROM tablename
            WHERE Scr <> 0
            Group By [user]
        ) b 
            ON a.[user] = b.[user] AND
               a.seq = b.maxSeq
ORDER BY ID

SQLFiddle デモ

于 2012-08-31T02:11:23.380 に答える
1

row_number() 関数を使用すると、スコアが 0 ではなく、seq の降順で並べられた、この条件を持つ行を特定できます。

select ID, Cde, User, Scr, Seq
from (select t.*,
             row_number() over (partition by user order by seq desc) as seqnum
      from t
      where scr <> 0
     ) t
where seqnum = 1

(「scr」はスコアだと思います。)

于 2012-08-31T02:15:38.767 に答える
0

自己結合は必要ありません。関数を使用して、各ユーザーrow_numberの最高を選択できます。seq

select ID, Cde, User, Scr, Seq from  (
   select *, row_number() over (partition by Cde order by Seq desc) rownum
   from tableName where scr <> 0
) a
where a.rownum=1

はではなく でrow_number()のみ有効であるため、これは内部クエリで実行する必要があります。selectwhere

于 2012-08-31T02:13:01.583 に答える