Я собираюсь предположить, что вы находитесь на SQL Server 2012
или новее.
Пример данные:
Следующий код, что я использовал для создания примера ситуации, представленной в этом вопросе.
create table #tmp_table (items char(1), date_entered_onto_system datetime)
insert into #tmp_table values ('P', '2016-11-08 12:01:00')
insert into #tmp_table values ('P', '2016-11-08 12:02:00')
insert into #tmp_table values ('P', '2016-11-08 12:03:00')
insert into #tmp_table values ('3', '2016-11-08 12:04:00')
insert into #tmp_table values ('3', '2016-11-08 12:05:00')
insert into #tmp_table values ('3', '2016-11-08 12:06:00')
insert into #tmp_table values ('3', '2016-11-08 12:07:00')
insert into #tmp_table values ('P', '2016-11-08 12:08:00')
insert into #tmp_table values ('P', '2016-11-08 12:09:00')
insert into #tmp_table values ('8', '2016-11-08 12:10:00')
insert into #tmp_table values ('8', '2016-11-08 12:11:00')
insert into #tmp_table values ('8', '2016-11-08 12:12:00')
insert into #tmp_table values ('P', '2016-11-08 12:13:00')
insert into #tmp_table values ('2', '2016-11-08 12:14:00')
insert into #tmp_table values ('P', '2016-11-08 12:15:00')
insert into #tmp_table values ('P', '2016-11-08 12:16:00')
insert into #tmp_table values ('P', '2016-11-08 12:17:00')
insert into #tmp_table values ('P', '2016-11-08 12:18:00')
insert into #tmp_table values ('P', '2016-11-08 12:19:00')
insert into #tmp_table values ('P', '2016-11-08 12:20:00')
Ответ:
Этот запрос использует lag()
функцию и over
пункта (ссылки ниже), которые доступны на SQL Server 2012
и позже. Этот запрос сравнивает значение items
между строкой и строкой перед ней (идет в хронологическом порядке в соответствии со значениями date_entered_onto_system
). Вычисляет значение 1, если оно должно подсчитываться, но 0, если нет, а затем sum
с этими значениями.
Lag Function
Over Clause
select b.items
, sum(b.sum_val) as items_cnt
from (
select a.items
, case when a.items = lag(a.items, 1, NULL) over (order by a.date_entered_onto_system asc) then 0 else 1 end as sum_val
from #tmp_table as a
) as b
group by b.items
Результаты:
Это выход из примера данных.
items items_cnt
2 1
3 1
8 1
P 4
Непонятный. Как выглядит один элемент? Почему бы просто не подсчитать строки с P? –
Пожалуйста, прочитайте [это] (http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/) для получения некоторых советов по улучшению вашего вопроса. И прочитайте описания противоречивых тегов, которые вы использовали. Полезно пометить вопросы базы данных как соответствующим программным обеспечением (MySQL, Oracle, DB2, ...), так и версией, например. 'SQL-сервер-2014'. – HABO
Я думал, что я был чист, но, перечитывая, я вижу, где может быть путаница. «P, 3, 8, 2» - это отдельные элементы. Я использовал смесь целых чисел и символов, чтобы математическое решение не было предложено. Это может быть легко «автомобиль, автобус, iPad, обувь», то есть с течением времени может быть «автомобиль, автомобиль, автомобиль, автобус, автобус, iPad, iPad, iPad, обувь, автомобиль, автомобиль». И я хочу свести к «автомобиль, автобус, iPad, обувь, автомобиль», а затем подсчитать экземпляры автомобиля – MisterO