Как я могу выбрать записи на основе этого конкретного критерия? - PullRequest
0 голосов
/ 22 мая 2018

Я использую SQL Server 2014 и SSMS для выполнения моих T-SQL запросов.

У меня есть следующая SQL таблица (выдержка) с именем Table1:

BkgID   ProfileID  ArrivalDate
 872      50        2018-01-03
 876      50        2018-01-03
 911      64        2018-02-15
 924      64        2018-04-15
 950      72        2018-05-04

Мне нужен мой запрос T-SQL, чтобы получить следующий вывод:

BkgID   ProfileID  ArrivalDate
 872      50        2018-01-03
 911      64        2018-02-15
 924      64        2018-04-15
 950      72        2018-05-04

Логика заключается в том, что запрос должен перечислять ProfileID с одинаковыми ArrivalDate только один раз.BkgID, который он выбирает для перечисления в таком сценарии, не важен.

Как мне написать такой запрос?

Ответы [ 3 ]

0 голосов
/ 22 мая 2018
select BkgID, ProfileID, ArrivalDate
from (
  select BkgID, ProfileID, ArrivalDate,
    ROW_NUMBER() OVER(PARTITION BY ProfileID, ArrivalDate Order By BkgID) RowIdx
  from yourTable)
where RowIdx = 1
0 голосов
/ 22 мая 2018

Вы также можете использовать корреляцию подход:

select t.*
from table t
where BkgID = (select top 1 t1.BkgID
               from table t1
               where t1.ProfileID = t.ProfileID and t1.ArrivalDate = t.ArrivalDate
               order by t1.BkgID asc
              );

Это предполагает, что ArrivalDate имеет некоторый разумный date формат, иначе используйте cast() функцию.

0 голосов
/ 22 мая 2018

Вы можете использовать ROW_NUMBER() оконную функцию для достижения этой цели.ORDER BY будет определять, какая запись будет первой в порядке следования каждого раздела.

;WITH RankingByProfile AS 
(
    SELECT
        T.BkgID,
        T.ProfileID,
        T.ArrivalDate,
        Ranking = ROW_NUMBER() OVER (PARTITION BY T.ProfileID, T.ArrivalDate ORDER BY T.BkgID ASC)
    FROM
        Table1 AS T
)
SELECT
    R.BkgID,
    R.ProfileID,
    R.ArrivalDate
FROM
    RankingByProfile AS R
WHERE
    R.Ranking = 1

Вы также можете использовать GROUP BY и получить MIN(BkgID), но вы не сможете получить доступ к другимстолбцы без агрегатных функций.

SELECT
    MinBkgID = MIN(T.BkgID),
    T.ProfileID,
    T.ArrivalDate
FROM
    Table1 AS T
GROUP BY
    T.ProfileID,
    T.ArrivalDate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...