这应该是一个简单的问题,但我不能让它工作:(
如何选择具有最大列值的行,作为另一列的组?
例如,
我有以下表定义:
ID
Del_Index
docgroupviewid
Run Code Online (Sandbox Code Playgroud)
现在的问题是我想先按结果分组docgroupviewid,然后从每个docgroupviewid组中选择一行,具体取决于哪一行最高del_index.
我试过了
SELECT docgroupviewid, max(del_index),id FROM table
group by docgroupviewid
Run Code Online (Sandbox Code Playgroud)
但是不是以正确的方式回报我id,而是最早id从群体中回归我docgroupviewid.
有任何想法吗?
Tim*_*ers 11
我自己多次努力,解决方案是以不同的方式思考你的查询.
我想要每个DocGroupViewID行,其中Del_Index是具有该DocGroupViewID的所有行的最高(最大):
SELECT
T.DocGroupViewID,
T.Del_Index,
T.ID
FROM MyTable T
WHERE T.Del_Index = (
SELECT MAX( T1.Del_Index ) FROM MyTable T1
WHERE T1.DocGroupViewID = T.DocGroupViewID
)
Run Code Online (Sandbox Code Playgroud)
当多行可以相同时Del_Index,它会变得更复杂,因为那时你需要一些方法来选择显示哪一行.
您可以使用CTE RANK()或ROW_NUMBER()函数来更好地控制结果,如下所示:
-- fake a source table
DECLARE @t TABLE (
ID int IDENTITY(1,1) PRIMARY KEY,
Del_Index int,
DocGroupViewID int
)
INSERT INTO @t
SELECT 1, 1 UNION ALL
SELECT 2, 1 UNION ALL
SELECT 3, 1 UNION ALL
SELECT 1, 2 UNION ALL
SELECT 2, 2 UNION ALL
SELECT 2, 2 UNION ALL
SELECT 1, 3 UNION ALL
SELECT 2, 3 UNION ALL
SELECT 3, 3 UNION ALL
SELECT 4, 3
-- show our source
SELECT * FROM @t
-- select using RANK (can have duplicates)
;WITH cteRank AS
(
SELECT
DocGroupViewID,
Del_Index,
ID,
RANK() OVER
(PARTITION BY DocGroupViewID ORDER BY Del_Index DESC)
AS RowRank,
ROW_NUMBER() OVER
(PARTITION BY DocGroupViewID ORDER BY Del_Index DESC)
AS RowNumber
FROM @t
)
SELECT *
FROM cteRank
WHERE RowRank = 1
-- select using ROW_NUMBER
;WITH cteRowNumber AS
(
SELECT
DocGroupViewID,
Del_Index,
ID,
RANK() OVER
(PARTITION BY DocGroupViewID ORDER BY Del_Index DESC)
AS RowRank,
ROW_NUMBER() OVER
(PARTITION BY DocGroupViewID ORDER BY Del_Index DESC)
AS RowNumber
FROM @t
)
SELECT *
FROM cteRowNumber
WHERE RowNumber = 1
Run Code Online (Sandbox Code Playgroud)
如果你有办法解决关系,只需将其添加到ORDER BY.