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(mode) 的字段

这是我尝试过的,但它不起作用:

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

这假设您只需要一行,即使模式的最大值重复。如果您想要所有值,请使用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 回答