2012-02-23 112 views
0

不相关的列来添加这是我的示例表和值:通过脚本

CREATE TABLE [dbo].[Test] 
(
[Id]  BIGINT NOT NULL DEFAULT(0), 
[VId] BIGINT NOT NULL DEFAULT(0), 
[Level] INT  NOT NULL DEFAULT(0) 
); 

INSERT INTO [dbo].[Test] ([Id], [VId], [Level]) VALUES (100, 1, 1); 
INSERT INTO [dbo].[Test] ([Id], [VId], [Level]) VALUES (101, 1, 2); 
INSERT INTO [dbo].[Test] ([Id], [VId], [Level]) VALUES (102, 1, 3); 
INSERT INTO [dbo].[Test] ([Id], [VId], [Level]) VALUES (103, 2, 1); 
INSERT INTO [dbo].[Test] ([Id], [VId], [Level]) VALUES (104, 3, 1); 
INSERT INTO [dbo].[Test] ([Id], [VId], [Level]) VALUES (105, 3, 2); 
INSERT INTO [dbo].[Test] ([Id], [VId], [Level]) VALUES (106, 4, 1); 
INSERT INTO [dbo].[Test] ([Id], [VId], [Level]) VALUES (107, 4, 2); 
INSERT INTO [dbo].[Test] ([Id], [VId], [Level]) VALUES (108, 4, 3); 
INSERT INTO [dbo].[Test] ([Id], [VId], [Level]) VALUES (109, 4, 4); 

因此,在现在我使用这个脚本:

SELECT 
    [T].[VId], MAX ([T].[Level]) AS [MaxLevel] 
FROM 
    [dbo].[Test] AS [T] 
GROUP BY 
    [T].[VId]; 

,并返回:

VId MaxLevel 
1  3 
2  1 
3  2 
4  4 

但我需要Id列,我不能将它添加到脚本组,我需要以下值:

VId MaxLevel Id 
1  3   102 
2  1   103 
3  2   105 
4  4   109 

您的建议是什么?

而且下面的值是足够任何识别符的标识与最大(级):

Id 
102 
103 
105 
109 

回答

2

使用的识别符柱用相同的表连接

是这样的:

SELECT [T].[VId], [T].[MaxLevel], [T1].[Id] 
FROM [dbo].[Test] AS [T1] JOIN 
    (SELECT [T].[VId], MAX ([T].[Level]) AS [MaxLevel] 
    FROM [dbo].[Test] AS [T] 
    GROUP BY [T].[VId]) AS [T] 
ON [T1].[VId] = [T].[VId] 
AND [T1].[Level] = [T].[MaxLevel] 
ORDER BY [T].[VId]; 

结果将是:

VId MaxLevel Id 
1 3   102 
2 1   103 
3 2   105 
4 4   109 
+0

你的脚本返回所有10行,像'SELECT * FROM [测试]' – Saeid 2012-02-23 07:11:45

+2

它缺乏'和[T1]。[等级] = [T] [MaxLevel]'在加入条件的一部分。 – 2012-02-23 07:20:01

+0

尝试更新一个,我已经添加了确保maxlevel被选中的条件 – kingpin 2012-02-23 07:27:37

1

使用此:

WITH LastLevels AS 
(
SELECT 
    [T].[VId] AS [VID], 
    MAX ([T].[Level]) AS [MaxLevel] 

FROM [dbo].[Test] AS [T] 
GROUP BY [T].[VId] 
) 

SELECT [LastLevels].[VID],[LastLevels].[MaxLevel], [Te].[Id] 
FROM [dbo].[Test] AS [Te] 
INNER JOIN [LastLevels] 
ON [LastLevels].[VID]=[Te].[VId] 
AND [LastLevels].[MaxLevel]=[Te].[Level] 
ORDER BY [LastLevels].[VID]; 
4

2008年的拿上的问题,因为这是你正在使用的是什么:

declare @Test table 
(
[Id]   BIGINT  NOT NULL DEFAULT(0), 
[VId]   BIGINT  NOT NULL DEFAULT(0), 
[Level]   INT   NOT NULL DEFAULT(0) 
); 

INSERT INTO @Test ([Id], [VId], [Level]) 
VALUES (100, 1, 1),(101, 1, 2),(102, 1, 3),(103, 2, 1),(104, 3, 1), 
(105, 3, 2),(106, 4, 1),(107, 4, 2),(108, 4, 3),(109, 4, 4); 

;With Numbered as (
    select *, 
     RANK() OVER (PARTITION BY VId ORDER BY [Level] desc) as rn 
from @Test) 
select VId,Level,Id from Numbered where rn=1 

注意,(与其他解决方案)这将输出多个如果有两行具有相同的最大级别,则每VId行。如果你不想要这样做,请将RANK()切换为ROW_NUMBER(),并且任意一个都会赢 - 或者如果你想在平局的情况下获得特定赢家,请将该条件添加到窗口函数的ORDER BY中。

0
SELECT ID, [VId], [MaxLevel] From 
(
    SELECT 
     [T].[VId], MAX ([T].[Level]) AS [MaxLevel] 
    FROM 
     [dbo].[Test] AS [T] 
    GROUP BY 
     [T].[VId] 
)K 
INNER JOIN [Test] T on T.[VId] = K.[VId] and T.[Level] = K.MaxLevel