1

これがサンプルデータセットです。

shareId mode    shareLevel  targetId    targetItemId
26          1   5           0           2
32          1   5           0           21
33          2   1           1           21
34          1   3           0           21

結果としてこれを取り戻そうとしています:

shareId mode    shareLevel  targetId    targetItemId
26          1   5            0          2
33          2   1            1          21

*結果として、「shareId」フィールドが必要です。

*TargetItemId でグループ化するため、特定の targetItemId に対して単一のレコードのみが返されます

*しかし、最高のモード値を持つレコードが必要なので、グループ化中に、MAX(モード) を持つフィールドが必要です

これが私が試したものですが、うまくいきません:

select shareId FROM shares group by targetItemId having mode = MAX(mode)

以下のみを返します。

shareId mode    shareLevel  targetId    targetItemId
26          1   5            0          2

したがって、基本的に、一意の各 targetItemId の shareId を取得するにはどうすればよいですか。ただし、最大のモードを持つ特定の targetItemId の行が必要です。どうすればいいですか?

4

3 に答える 3

1

これは、ランキング関数を使用して行うことができます。

select shareId, mode, shareLevel, targetId, targetItemId
from (select t.*,
             row_number() over (partition by targetItemId order by mode desc) as seqnum
      from t
     ) t
where seqnum = 1

これは、モードの最大値が繰り返されたとしても、1 行だけが必要であると想定しています。すべての値が必要な場合は、dense_rank代わりに を使用しますrow_number

于 2012-09-27T14:42:30.583 に答える
1

これは、どの rdbms に対しても機能するはずです。

select shareId
from shares s
join (select max(mode) as mode,targetItemId from shares group by targetItemId) s_max
  on s.mode=s_max.mode 
 and s.targetItemId =s_max.targetItemId
于 2012-09-27T14:42:36.013 に答える
0

を使用している場合はMSSQL 2008+、これを試してください

WITH latestRecord
AS
(
    SELECT  shareId, [mode]    ,shareLevel  ,targetId   , targetItemId,
            ROW_NUMBER() OVER (PARTITION BY targetItemId ORDER BY [mode] DESC) AS RN
    FROM    tableName
)
SELECT  shareId, [mode]    ,shareLevel  ,targetId   , targetItemId
FROM    latestRecord
WHERE   RN = 1
于 2012-09-27T14:42:39.823 に答える