2016-11-07 4 views
-1

Я ищу, чтобы подсчитать набор результатов, когда элементы, введенные в систему последовательно, свертываются как единое целое, а затем экземпляры подсчитываются из результирующего набора строк/результатов.count свернутые последовательные результаты

SELECT items 
FROM table 
WHERE user = 'John Doe' 
ORDER BY date_entered_onto_system 

т.е. с течением времени, введенные элементы на систему в хронологическом порядке являются PPP3333PP888P222PPPPPP

Я хочу, чтобы свернуть строку, в которой элементы последовательно введенную на систему, т.е. P3P8P2P , а затем подсчитывают в результате число P, поэтому ответ здесь будет = 4

Использование T-SQL. большое спасибо за помощь

+0

Непонятный. Как выглядит один элемент? Почему бы просто не подсчитать строки с P? –

+0

Пожалуйста, прочитайте [это] (http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/) для получения некоторых советов по улучшению вашего вопроса. И прочитайте описания противоречивых тегов, которые вы использовали. Полезно пометить вопросы базы данных как соответствующим программным обеспечением (MySQL, Oracle, DB2, ...), так и версией, например. 'SQL-сервер-2014'. – HABO

+0

Я думал, что я был чист, но, перечитывая, я вижу, где может быть путаница. «P, 3, 8, 2» - это отдельные элементы. Я использовал смесь целых чисел и символов, чтобы математическое решение не было предложено. Это может быть легко «автомобиль, автобус, iPad, обувь», то есть с течением времени может быть «автомобиль, автомобиль, автомобиль, автобус, автобус, iPad, iPad, iPad, обувь, автомобиль, автомобиль». И я хочу свести к «автомобиль, автобус, iPad, обувь, автомобиль», а затем подсчитать экземпляры автомобиля – MisterO

ответ

0

Я собираюсь предположить, что вы находитесь на 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 
+0

Спасибо @tarheel. Я новичок, когда речь заходит о TSQL, поэтому спасибо за ввод. Это очень ценится. – MisterO

+0

@MisterO Нет проблем, рад, что мое предположение оказалось правдой. Если это решит вашу проблему, обязательно нажмите галочку, чтобы показать это как официальный ответ. Если это не даст мне знать, и мы увидим, что нужно сделать. – tarheel

+0

@MisterO Как это получилось? – tarheel

Смежные вопросы