2016-11-07 33 views
-1

我在計算一個結果集,其中連續輸入到系統的項目作爲單個單元進行摺疊,然後從結果字符串/結果集中計數實例。計數崩潰連續結果

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

即隨着時間的推移,項目輸入到系統中的日期順序是PPP3333PP888P222PPPPPP

我要崩潰了,其中項目被連續輸入到系統中的字符串,即P3P8P2P 再算上產生的數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服務器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及更高版本。此查詢比較行和其之前的行(根據date_entered_onto_system值按時間順序排列)之間的值爲items。如果它應該計數,則計算爲1,但如果不計算則計算爲0,然後它將這些值計算出來。

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時,我是一個noob,所以感謝輸入。非常感謝。 – MisterO

+0

@MisterO沒問題,很高興我的假設變成了事實。如果這解決了您的問題,請務必點擊複選標記顯示此爲正式答案。如果它不讓我知道,我們會看到需要做什麼。 – tarheel

+0

@MisterO這是怎麼回事? – tarheel