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

Откуда:
Сообщений: 1
Здравствуйте! Прошу прощения если вопрос подобный был, суть проблемы:
Есть таблица Автомобили, таблица состоит из даты и марки автомобиля, дата показывает день когда автомобиль был сдан в прокат (прокат дается на 1н день), как определить сколько дней подряд брали каждую машину?
Например
Дата Марка Кол-во
8.2.2015 Форд 1
8.2.2015 Мазда 1
9.2.2015 Форд 2
9.2.2015 Тойота 1
11.2.2015 Форд 1
12.2.2015 Форд 2
13.2.2015 Форд 3

Буду благодарен любой помощи
8 фев 15, 01:16    [17234022]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на подсчет автомобилей  [new]
Добрый Э - Эх
Guest
AlexMerser,
Искать по фразе "группировка по разности двух разноконных row_number-ов"
8 фев 15, 13:22    [17234580]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на подсчет автомобилей  [new]
Добрый Э - Эх
Guest
AlexMerser,

Хотя, поиск по grp_id даст гораздо больше вариантов ;)
8 фев 15, 13:39    [17234628]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на подсчет автомобилей  [new]
wizli
Member

Откуда: Minsk
Сообщений: 270
Вот решение. Не самое изящное, но решение.

;with CTE_min as (
select	min(date) as date
from	dbo.cars)


, island as (
select	mark
		,date
		,DATEDIFF(dd,(select top (1) date from CTE_min),date) 
		- dense_rank() over (partition by mark order by date) as row
from dbo.cars

)

select	distinct
		mark
		,min(date) over (partition by mark, row) as [date_from]
		,max(date) over (partition by mark, row) as [date_to]
		,count(*) over (partition by mark, row) as [count_day]
from island
8 фев 15, 14:33    [17234737]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на подсчет автомобилей  [new]
Добрый Э - Эх
Guest
wizli
Вот решение. Не самое изящное, но решение.
Да уж...
Всё же гораздо проще:
--
-- Тестовый набор данных:
with
  t ([Дата], [Марка]) as
    (
      select cast(a as datetime), b
        from (
               values 
                 ('2015-02-08',   'Ford'),
                 ('2015-02-08',  'Mazda'),
                 ('2015-02-09',   'Ford'),
                 ('2015-02-09', 'Toyota'),
                 ('2015-02-11',   'Ford'),
                 ('2015-02-12',   'Ford'),
                 ('2015-02-13',   'Ford')
             ) v(a,b)
    )
--
-- Основной запрос:
select [Дата], [Марка],
       count(1) over(partition by [Марка], grp_id order by [Дата]) as [Кол-во]
  from (
         select t.*,
               [Дата] - row_number() over(partition by [Марка] order by [Дата]) as grp_id
          from t
       ) v
order by [Дата], [Марка]
on-line проверка на sqlfiddle.com
8 фев 15, 15:22    [17234814]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить