Выберите несколько столбцов, имеющих отличительные только в 3 из них - PullRequest
0 голосов
/ 08 июня 2019

У меня есть таблица, в которой мне нужно вернуть около 14 значений столбцов, но вернуть только 1 строку для дубликатов в некоторых столбцах.

Вторая проблема заключается в том, что между дубликатами мне нужно хранить тот, у которого наибольшее значение int, в одном из столбцов, который не обязательно должен быть уникальным.

Поскольку таблица несколько большая, я ищу совета, как сделать это наиболее эффективным способом.

я должен делать группу?

моя таблица примерно такая, я упросту количество столбцов.

ID(UniqueIdentifier)                  | ACCID(UniqueIdentifier)               |   DateTime(DateTime)    | distance(int)|type(int)
28761188-0886-E911-822F-DD1FA635D450    1238FD8A-BD00-411A-A81C-0F6F5C026BCC    2019-06-03 14:04:41.000        2             3
41761188-0886-E911-822F-DD1FA635D450    1238FD8A-BD00-411A-A81C-0F6F5C026BCC    2019-06-03 14:04:41.000        1             3

Я должен выбирать только тогда, когда ACCID и DATETIME уникальны, идентификатор столбца в первичном, поэтому никогда не будет повторяться, и мне нужно, чтобы строка находилась на самом большом расстоянии.

Ответы [ 2 ]

0 голосов
/ 08 июня 2019

Я бы предложил коррелированный подзапрос с правильным индексом в качестве самого быстрого метода:

select t.*
from t
where t.id = (select top (1) t2.id
              from t t2
              where t2.ACCID = t.ACCID
              order by t2.distance desc
             ) ;

Лучший индекс для (ACCID, distance desc, id).

0 голосов
/ 08 июня 2019

Вы можете использовать функцию окна ROW_NUMBER(), например:

select *
from (
  select
    id,
    accid,
    datetime,
    distance,
    type,
    row_number() over(partition by accid, datetime order by type desc) as rn
  from t
) x
where rn = 1

Если вы хотите показать несколько «связей», замените ROW_NUMBER() на RANK().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...