2013-08-16 50 views
1

我正在使用PostgreSql並試圖爲我的日誌生成報告查詢,但不幸失敗... 基本上我有記錄其他實體狀態更改的LOG表。所以爲了簡單起見,可以說它有STATUS和STATUS_CHANGE_DATE列。現在,每個狀態更改都會更新此記錄表,並顯示新的狀態和更改的時間。我需要的是每個狀態的持續時間和次數狀態(相同的狀態可以多次使用,例如從狀態1到2然後回到1)。我想爲它構建一個視圖,並在我的Java應用程序報告中使用,將該視圖映射到hibernate實體。不幸的是,我不是那種經驗豐富的SQL,所以也許有人可以給我一些什麼是最好的解決方案的提示,因爲我嘗試了幾件事,但基本上不知道該怎麼做。 比方說,我們有:SQL查詢報告持續時間,直到下一個日誌條目

STATUS STATUS_CHANGE_DATE 
1  2013 01 01 
2  2013 01 03 
1  2013 01 06 
3  2013 01 07 

我想要的結果將是包含狀態1,2倍和3天的期限和狀態2 1次用3天的期限也一表(假定狀態3月底(或接近)並且它的持續時間不是必需的)。

任何想法?

+1

請提供樣品結果闡明你所要求的。 –

+1

最簡單的解決方案是使用'LEAD()'函數來計算跨度;看到這裏:http://stackoverflow.com/questions/7974866/how-to-compare-the-current-row-with-next-and-previous-row-in-postgresql。 – 2013-08-16 22:51:15

+0

我認爲*當狀態爲特定值時,您試圖將狀態邊緣列表(狀態更改時的記錄)轉換爲時間範圍列表。你的解釋很難遵循,這裏沒有足夠清晰的樣本數據/預期結果信息,所以我不能做比猜測更多的事情。 –

回答

1

,如果你的狀態是每一行中改變,你可以做到這一點

with cte as (
    select 
     status, 
     lead(status_change_date) over(order by status_change_date) as next_date, 
     status_change_date 
    from Table1 
) 
select 
    status, count(*) as cnt, 
    sum(next_date - status_change_date) as duration 
from cte 
where next_date is not null 
group by status 

sql fiddle demo

1

試試這個:

SELECT "STATUS", "STATUS_CHANGE_DATE" - lag("STATUS_CHANGE_DATE") OVER (ORDER BY "STATUS_CHANGE_DATE") AS "DURATION" FROM table ORDER BY "STATUS"; 

這在類似的情況下,工作對我來說,在我來說,我需要計算會話之間的平均時間在日誌表。我希望這對你有用。