2012-02-23 122 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