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

Привожу таблицу из нескольких строк.

ClientKey | Date | DocumentKey
1 | 24.06.2015 15:30 | 5
1 | 24.06.2015 14:30 | 6
1 | 24.06.2015 18:30 | 7
2 | 24.06.2015 15:30 | 8


Необходимо сгруппировать список по клиенту и отобразить ключ документа клиента у которого дата минимальна:

ClientKey | Date | DocumentKey
1 | 24.06.2015 14:30 | 6
2 | 24.06.2015 15:30 | 8

мой скрипт, который не правильно выводит данные:
  SELECT
    [DOCS_DocumentSale].[ClientInfo] AS [ClientKey],
    MIN([DOCS_DocumentSale].[Key]) AS [DocumentKey],
    MIN([DOCS_DocumentSale].[Date]) AS [DocumentDate]
  FROM
    [DOCS_DocumentSale]
  GROUP BY
    [DOCS_DocumentSale].[ClientInfo]


Как правильно сгруппировать и получить дату и ключ документа?
24 июн 15, 11:26    [17810314]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с группировкой в запросе.  [new]
Gviber
Member

Откуда:
Сообщений: 124
   SELECT top 1 with ties
    [ClientInfo] AS [ClientKey],
    [Key] AS [DocumentKey],
    [Date] AS [DocumentDate]
  FROM [DOCS_DocumentSale]
  order by RANK() OVER(partition by [ClientInfo] order by [Date]) 
24 июн 15, 11:31    [17810365]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с группировкой в запросе.  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
igor888
Как правильно сгруппировать и получить дату и ключ документа?
Например, пронумеровать возвращаемые строки для каждого ClientKey ROW_NUMBER()OVER()ом в порядке возрастания даты, оставить только с номером 1.

И ещё два десятка способов - почти каждый день поднимается, поищите по форуму.
24 июн 15, 11:32    [17810369]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с группировкой в запросе.  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Gviber
   SELECT top 1 with ties
    [ClientInfo] AS [ClientKey],
    [Key] AS [DocumentKey],
    [Date] AS [DocumentDate]
  FROM [DOCS_DocumentSale]
  order by RANK() OVER(partition by [ClientInfo] order by [Date]) 
Из-за RANK() теоретически может вернуться более 1 строки для одного клиента
24 июн 15, 11:33    [17810382]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с группировкой в запросе.  [new]
Gviber
Member

Откуда:
Сообщений: 124
Все верно. Если даты одинаковые у одного, вернется больше одной строки.

Если не устраивает нужно менять на ROW_NUMBER()
24 июн 15, 11:34    [17810391]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с группировкой в запросе.  [new]
igor888
Guest
Gviber
Все верно. Если даты одинаковые у одного, вернется больше одной строки.

Если не устраивает нужно менять на ROW_NUMBER()


Чисто теоретически, дата документа повторится не может, но на практике бывает невероятное.

А как это через ROW_NUMBER()... нигде не применял ранее. Можете привести пример?
24 июн 15, 13:01    [17810878]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с группировкой в запросе.  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
igor888
А как это через ROW_NUMBER()... нигде не применял ранее. Можете привести пример?
Замените слово RANK на слово ROW_NUMBER, и попробуйте
24 июн 15, 13:04    [17810895]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с группировкой в запросе.  [new]
igor888
Guest
iap
igor888
А как это через ROW_NUMBER()... нигде не применял ранее. Можете привести пример?
Замените слово RANK на слово ROW_NUMBER, и попробуйте


Спасибо.
Работает и так и так))) понятно, что с ROW_NUMBER надёжнее.
24 июн 15, 13:17    [17810983]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с группировкой в запросе.  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
igor888
iap
пропущено...
Замените слово RANK на слово ROW_NUMBER, и попробуйте


Спасибо.
Работает и так и так))) понятно, что с ROW_NUMBER надёжнее.
В случае нескольких равных минимальных дат для одного и того же клиента
вернётся какая-то случайно выбранная запись из нескольких подходящих.
Описываете это словом "надёжнее"? Однако...
24 июн 15, 13:20    [17811009]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с группировкой в запросе.  [new]
igor888
Guest
iap
igor888
пропущено...


Спасибо.
Работает и так и так))) понятно, что с ROW_NUMBER надёжнее.
В случае нескольких равных минимальных дат для одного и того же клиента
вернётся какая-то случайно выбранная запись из нескольких подходящих.
Описываете это словом "надёжнее"? Однако...



Тогда что надёжнее?
24 июн 15, 13:23    [17811034]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с группировкой в запросе.  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
igor888
iap
пропущено...
В случае нескольких равных минимальных дат для одного и того же клиента
вернётся какая-то случайно выбранная запись из нескольких подходящих.
Описываете это словом "надёжнее"? Однако...



Тогда что надёжнее?
Надёжнее определиться, что надо вернуть в описанной ситуации,
а не полагаться на случай. Например, написать CONSTRAINT, чтобы в таблице пары (Клиент, Дата)
были уникальными.
24 июн 15, 13:26    [17811056]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с группировкой в запросе.  [new]
Wlr-l
Member

Откуда:
Сообщений: 606
iap
igor888
пропущено...


Спасибо.
Работает и так и так))) понятно, что с ROW_NUMBER надёжнее.
В случае нескольких равных минимальных дат для одного и того же клиента
вернётся какая-то случайно выбранная запись из нескольких подходящих.
Описываете это словом "надёжнее"? Однако...


Для обеспечения детерминированности результата нумерации строк нужно всего лишь обеспечить уникальность комбинации элементов упорядочения и секционирования.
24 июн 15, 14:13    [17811340]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с группировкой в запросе.  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Wlr-l
Для обеспечения детерминированности результата нумерации строк нужно всего лишь обеспечить уникальность комбинации элементов упорядочения и секционирования.
А я что написал?
24 июн 15, 14:21    [17811389]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с группировкой в запросе.  [new]
Wlr-l
Member

Откуда:
Сообщений: 606
iap,

CONSTRAINT и "обеспечение детерминированности результата нумерации строк" относятся к разным объектам.

Можно иметь CONSTRAINT и НЕ "обеспечить детерминированность результата нумерации строк", собственно, и наоборот.
24 июн 15, 14:38    [17811510]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить