2016-11-07 1 views
-1

시스템에 연속적으로 입력 된 항목이 하나의 단위로 축소 된 결과 집합을 계산하려고하면 결과 문자열/결과 집합에서 인스턴스가 계산됩니다. 내가 항목을 연속적으로 시스템에 입력 된 문자열, 즉 P3P8P2P 을 축소하고의 결과 수를 계산하려면 PPP3333PP888P222PPPPPP연속 된 결과 개수가

시간에

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

즉, 항목은 날짜 순서대로 시스템에 입력 P이므로 여기에 답 = 4가됩니다.

T-SQL 사용. 도움을 위해 미리 많은 감사드립니다

+0

명확하지 않습니다. 단일 아이템은 어떻게 생겼습니까? P로 행 수를 계산하는 것이 어떨까요? –

+0

질문 개선에 대한 정보는 [this] (http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/)를 참조하십시오. 그리고 사용했던 모순 된 태그에 대한 설명을 읽어보십시오. 적절한 소프트웨어 (MySQL, Oracle, DB2 등)와 버전으로 데이터베이스 질문에 태그를 지정하는 것이 좋습니다. 'sql-server-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() 기능과 SQL Server 2012 나중에 사용할 수있는 over 절 (아래 링크)를 사용합니다. 이 쿼리는 행과 행 앞에있는 items 값을 비교합니다 (date_entered_onto_system 값에 따라 시간순으로 진행됨). 카운트해야 할 경우 1로 평가하고 그렇지 않은 경우 0으로 평가 한 다음 sum까지 값을 계산합니다.

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 

Lag Function

결과

이는 예컨대 데이터가 출력된다.

items items_cnt 
    2  1 
    3  1 
    8  1 
    P  4 
+0

Thanks @tarheel. 나는 TSQL에 관한 한 멍청한 의견이다. 크게 감사드립니다. – MisterO

+0

@MisterO 아무 문제 없어, 기꺼이 내 가정은 사실로 밝혀졌습니다. 이 방법으로 문제가 해결되면 공식 답변으로 체크 표시를 클릭하십시오. 그것이 나에게 알려주지 않으면, 우리는해야 할 일이 무엇인지 보게 될 것입니다. – tarheel

+0

@MisterO 어떻게 되셨습니까? – tarheel