2012-09-27 93 views
1

以下是一個示例數據集。SQL獲取另一個字段最大的最大主鍵

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具有最大的模式。我該怎麼做呢?

+0

你怎麼確定你想記錄#26,而不是#33或#34 ?從你的描述來看,它們似乎都能平等地滿足你的要求。 – ruakh

+0

另外 - 你應該指出你正在使用哪個SQL引擎(PostgreSQL?MySQL?SQL Server?Oracle?),因爲它們對分析功能的支持都不相同。 – ruakh

回答

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

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 
+0

針對數據庫不可知論的答案+1,並毆打我! –

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 
相關問題