Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 группировка. Чем заменить First?  [new]
Shovgenyuk
Member

Откуда: Ивано-Франковск-Киев
Сообщений: 462
Как с помощью группировки для каждого значения столбца ID1 выбрать значение из столбца ID2 , которое соответствует минимальному значению из столбца DateA?

У Access для этого есть функция FIRST.
SELECT ID1, FIRST(ID2), MIN(DateA) From Table1...


У SQL-Server такой функции нету :(

Вместо FIRST(ID2) написать MIN(ID2) не подходит,так как значение ID2, которое соответствует минимальной дате из стобца DateA, не всегда минимальное.

Пример
Исходные данные
ID1 ID2 DateA
1 10 01.01.2017
1 12 02.01.2017
2 20 04.01.2017
2 21 04.01.2017
2 8 10.01.2017

Результат
ID1 ID2
1 10
2 20
9 сен 17, 00:44    [20783300]     Ответить | Цитировать Сообщить модератору
 Re: группировка. Чем заменить First?  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
Shovgenyuk
У SQL-Server такой функции нету :(
зато есть over
9 сен 17, 01:07    [20783307]     Ответить | Цитировать Сообщить модератору
 Re: группировка. Чем заменить First?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36905
Как это нету? Все есть.
9 сен 17, 01:14    [20783310]     Ответить | Цитировать Сообщить модератору
 Re: группировка. Чем заменить First?  [new]
Shovgenyuk
Member

Откуда: Ивано-Франковск-Киев
Сообщений: 462
Гавриленко Сергей Алексеевич,

SQL-Server 2008
9 сен 17, 01:25    [20783318]     Ответить | Цитировать Сообщить модератору
 Re: группировка. Чем заменить First?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Shovgenyuk,

пронумеруйте ROW_NUMBERом, оставьте только строки с номером 1.
9 сен 17, 11:24    [20783545]     Ответить | Цитировать Сообщить модератору
 Re: группировка. Чем заменить First?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
SELECT TOP(1) WITH TIES *
FROM T
ORDER BY RANK() OVER(PARTITION BY ID1 ORDER BY DateA, ID2);
9 сен 17, 11:42    [20783579]     Ответить | Цитировать Сообщить модератору
 Re: группировка. Чем заменить First?  [new]
Massa52
Member

Откуда:
Сообщений: 379
вариант 1 от iap
WITH t(ID1, ID2, DateA) AS
(
   SELECT 1, 10, '20170101'
   UNION ALL
   SELECT 1, 12, '20170102'
   UNION ALL
   SELECT 2, 20, '20170104'
   UNION ALL
   SELECT 2, 21, '20170104'
   UNION ALL
   SELECT 2, 8, '20170110'
),
c AS
(SELECT 
  ROW_NUMBER() OVER(PARTITION BY ID1 ORDER BY DateA, ID2) n,
  ID1, ID2, DateA
FROM t
)
SELECT *
FROM c
WHERE n = 1
9 сен 17, 13:18    [20783750]     Ответить | Цитировать Сообщить модератору
 Re: группировка. Чем заменить First?  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
iap
SELECT TOP(1) WITH TIES *
FROM T
ORDER BY RANK() OVER(PARTITION BY ID1 ORDER BY DateA, ID2);
а зачем сортировка по ID2? ТСу нужно "первое вхождение".
9 сен 17, 13:45    [20783781]     Ответить | Цитировать Сообщить модератору
 Re: группировка. Чем заменить First?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Дедушка
iap
SELECT TOP(1) WITH TIES *
FROM T
ORDER BY RANK() OVER(PARTITION BY ID1 ORDER BY DateA, ID2);

а зачем сортировка по ID2? ТСу нужно "первое вхождение".
Там же дата одинаковая.
Как предлагается выбрать одно из двух?
9 сен 17, 13:50    [20783794]     Ответить | Цитировать Сообщить модератору
 Re: группировка. Чем заменить First?  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
iap
Как предлагается выбрать одно из двух?
ну дак "первое вхождение" если я правильно понимаю суть ф-ии FIRST
9 сен 17, 14:46    [20783840]     Ответить | Цитировать Сообщить модератору
 Re: группировка. Чем заменить First?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Дедушка
iap
Как предлагается выбрать одно из двух?
ну дак "первое вхождение" если я правильно понимаю суть ф-ии FIRST
Какое же из двух первое?
В данном случае если убрать ID2 из ORDER BY, то RANK() выдаст все записи с одинаковой минимальной датой.
Если нужна только одна, но неизвестно какая, замените RANK() на ROW_NUMBER().
9 сен 17, 15:54    [20783894]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить