Добавить не релевантный столбец в группу по сценарию - PullRequest
0 голосов
/ 23 февраля 2012

Это мой пример таблицы и значений:

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

Ответы [ 4 ]

4 голосов
/ 23 февраля 2012

На вопрос 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 оконной функции.

2 голосов
/ 23 февраля 2012

Использовать соединение с одной и той же таблицей по столбцу VId

как то так:

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
1 голос
/ 23 февраля 2012

Используйте это:

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];
0 голосов
/ 23 февраля 2012
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...