Как выбрать только строки с максимальным VID в таблице с несколькими VID и другими полями? - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть представление на сервере SQL, которое дает мне записи о некоторых играх. Он возвращает несколько записей, принадлежащих игре, и они имеют одинаковый Gid, но разные версии имеют разные Vids, как показано ниже

vid gid otherData(Platform)
2   1   PC
2   1   PC ...
3   1   X1
3   1   X2....
2   5   PC
2   5   PC ...
3   5   X1
3   5   X2....

howиспользовать group by и выбрать или что-то еще, чтобы выбрать только эти записи?

3   1   X1
3   1   X2....
3   5   X1
3   5   X2....

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Решения с использованием GROUP BY:

  • С CTE:

    ;WITH HighestVIDByGID AS
    (
        SELECT
            V.gid,
            MaxVid = MAX(V.vid)
        FROM
            vYourView AS V
        GROUP BY
            V.gid
    )
    SELECT
        V.*
    FROM
        vYourView AS V
        INNER JOIN HighestVIDByGID AS M ON 
            V.gid = M.gid AND
            V.vid = M.MaxVid
    
  • Использование INNER JOIN с подзапросом:

    SELECT
        T.*
    FROM
        vYourView AS T
        INNER JOIN (
                SELECT
                    V.gid,
                    MaxVid = MAX(V.vid)
                FROM
                    vYourView AS V
                GROUP BY
                    V.gid
            ) AS M ON
                T.gid = M.gid AND
                T.vid = M.MaxVid
    
  • Использование EXISTS:

    SELECT
        T.*
    FROM
        vYourView AS T
    WHERE
        EXISTS (
            SELECT
                'max vid version'
            FROM
                vYourView AS V
            GROUP BY
                V.gid
            HAVING
                T.gid = V.gid AND
                T.vid = MAX(V.vid))
    
0 голосов
/ 19 февраля 2019

Вы хотите dense_rank():

select top (1) with ties t.*
from table t
order by dense_rank() over (partition by gid order by vid desc);

РЕДАКТИРОВАТЬ:

select t.*
from (select t.*,
             dense_rank() over (partition by gid order by vid desc) as seq
      from table t
     ) t
where seq = 1;
...