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

Откуда:
Сообщений: 3
Доброго времени суток !


Имеется таблица:

DATE | QTY
2011-01-01 | 2.00
2011-01-02 | 3.00
2011-01-03 | 3.00
2011-01-04 | 3.00
2011-01-05 | 4.00
2011-01-06 | 4.00
2011-01-07 | 3.00
2011-01-08 | 3.00


Необходимо получить следующий результат:

DATE_START | DATE_END | QTY
2011-01-01 | 2011-01-01 | 2.00
2011-01-02 | 2011-01-04 | 3.00
2011-01-05 | 2011-01-06 | 4.00
2011-01-07 | 2011-01-08 | 3.00

то есть каждая запись в результирующем запросе показыает период в котором QTY не изменялось

Спасибо.
26 дек 11, 21:10    [11829663]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз с запросом (выбор групп одинаковых значений)  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
kitov, что именно не получается?
26 дек 11, 21:33    [11829732]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз с запросом (выбор групп одинаковых значений)  [new]
IUnIKnown
Member

Откуда:
Сообщений: 9
А как насчет такой реализации
SELECT MIN(DATE) as DATE_START,MAX (DATE) as DATE_END,QTY
FROM Table
GROUP BY QTY
27 дек 11, 09:40    [11830846]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз с запросом (выбор групп одинаковых значений)  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
SET NOCOUNT ON;

WITH
 T AS
 (
  SELECT * FROM
  (
   VALUES
    ('20110101',2.00)
   ,('20110102',3.00)
   ,('20110103',3.00)
   ,('20110104',3.00)
   ,('20110105',4.00)
   ,('20110106',4.00)
   ,('20110107',3.00)
   ,('20110108',3.00)
  ) T([DATE],[QTY])
 )
,CTE AS
(
 SELECT N=ROW_NUMBER()OVER(ORDER BY [DATE])-ROW_NUMBER()OVER(PARTITION BY QTY ORDER BY [DATE]),*
 FROM T 
)
SELECT DATE_START=MIN([DATE]),DATE_END=MAX([DATE]), QTY
FROM CTE
GROUP BY N,QTY
ORDER BY DATE_START;
27 дек 11, 09:55    [11830946]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз с запросом (выбор групп одинаковых значений)  [new]
kitov
Member

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

при такой реализации потеряется последняя запись в результирующей выборке, а именно:

2011-01-07 | 2011-01-08 | 3.00

Спасибо за ответ.
27 дек 11, 15:27    [11833686]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз с запросом (выбор групп одинаковых значений)  [new]
kitov
Member

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

это похоже то, что надо.

Большое Вам спасибо ! :)
27 дек 11, 15:38    [11833774]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз с запросом (выбор групп одинаковых значений)  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
kitov
iap,

это похоже то, что надо.

Большое Вам спасибо ! :)
Поищите по форуму - предлагались и другие решения.
По утверждению aleks2 более производительные.

К примеру, прстая идея: для левой границы периода более ранний соседний момент времени имеет другое значение (можно NOT EXISTS использовать).
А первый момент времени после левой границы, для которого первый более поздний сосед имеет другое значение - это правая граница.
NOT EXISTS работает быстро. Может, и впрямь лучше предложенного мной варианта. Зато он короче!
27 дек 11, 16:07    [11833939]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить