[英]How can I count rows matching criteria for each week in MySQL?
我有一個存儲票據請求的表,並記錄請求和解決的日期。
我想制作一個查詢,它將在歷史上每周顯示系統中有多少未解決的票證。
問題是如果我使用請求的日期作為組標准,那么未解決超過一周的故障單不會被計算兩次。 我想確保任何未解決的票證超過我的組大小,根據需要多次提供其計數。
例如,使用以下數據:
id requested resolved
== ========== ==========
1 2015-07-01 2015-07-02
2 2015-07-01 NULL
3 2015-07-08 2015-07-10
4 2015-07-08 NULL
第一(26)和第二周(27)各有兩個請求。 每周有一個已解決的請求和一個未解決的請求,因此查詢結果應顯示第一周1未解析,第二周未解析2。 (在未來一周內具有解決方案日期的項目也算作未解決的,但為了簡化此示例,我只顯示空日期。)
我希望結果顯示:
year week # unresolved
==== ==== ============
2015 26 1
2015 27 2
到目前為止我的查詢:
SELECT
YEAR(requested) `year`,
WEEK(requested, 5) `week`,
COUNT(id) `# unresolved`
FROM
tickets
WHERE
WEEK(requested) < WEEK(resolved)
OR resolved IS NULL
GROUP BY `Year`, `Week`;
每周僅顯示1張未解決的票證:
year week # unresolved
==== ==== ============
2015 26 1
2015 27 1
我應該注意什么來適當地修改這個查詢?
http://sqlfiddle.com/#!9/90782/1/0
編輯:
作為附加信息,這是一個相對簡單的查詢,為其提供任何特定的周檢查:
SELECT
COUNT(id) `# unresolved`
FROM
tickets
WHERE
WEEK(requested) <= WEEK('2015-07-01')
AND
(
WEEK(resolved) > WEEK('2015-07-01')
OR resolved IS NULL
);
通過更改輸入周,可以獲得任何感興趣的一周的未解決的票數。 我的目標是創建一個查詢,按周對所有可用數據進行分組,而不是修改此查詢以獲得單周結果。
(注意:我正在展示我的思考過程,但您只需要在此答案中進行最終查詢)
我會把請求的票證和票證分解為兩種不同類型的事件,所以
select requested eventDate, 1 ticketChange from table
會給我每張請求的機票1和1
select resolved eventDate, -1 ticketChange from table
會給每個已解決的機票一個-1計數。 如果我將這兩個查詢聯合起來,我會得到一個日期列表,其中包含+1和-1,表示是否添加或解決了故障單。 所以我每周都可以得到一個未解決的問題
select year(eventDate) myYear, week(eventDate) myWeek, sum(ticketChange) totTicketChange
from (select requested eventDate, 1 ticketChange from table union all
select resolved eventDate, -1 ticketChange from table where resolved is not null)
group by year(eventDate) asc, week(eventDate) asc
但是既然你需要一個累計總數,那么我會定義一個變量@unresolvedCount並在我瀏覽選擇行時遞增它:
set @unresolvedCount := 0;
select myYear, myWeek, (@unresolvedCount := @unresolvedCount + totTicketChange) unresolved
from (select year(eventDate) myYear, week(eventDate) myWeek, sum(ticketChange) totTicketChange
from (select requested eventDate, 1 ticketChange from tickets union all
select resolved eventDate, -1 ticketChange from tickets where resolved is not null) TicketEvents
group by year(eventDate) asc, week(eventDate) asc) TicketCummulative
這完全符合你的要求。 我已經用上面提到的小提琴檢查了它,如果你能找到一個更有效的算法去做你想做的事情,我會感到驚訝。 我還建議您自己運行每個內部查詢,查看其結果,然后逐步解決問題。 這將讓您深入了解它的工作原理。
如果您想僅在特定時間段(例如當前年份)獲得結果,則根據您的需要,有三種不同的方法可以執行此操作。 如果你想只計算在這段時間內被請求的門票,也就是,例如,你不想來算被要求,去年即使他們仍然沒有得到解決,或者即使他們得到了今年解決門票,然后你會把最里面的查詢改為:
select requested eventDate, 1 ticketChange from tickets where requested >= '2015-01-01' union all
select resolved eventDate, -1 ticketChange from tickets where requested >= '2015-01-01' and resolved is not null
如果要計算在給定時間段內請求或解決的故障單,則可以將最里面的查詢更改為:
select requested eventDate, 1 ticketChange from tickets where requested >= '2015-01-01' union all
select resolved eventDate, -1 ticketChange from tickets where resolved is not null and resolved >= '2015-01-01'
如果您想計算所有門票,只要它們在當前時間段內被請求或解決,或者它們仍未解決(即使它們是3歲),那么您必須將測試作為日期,在完整查詢的最后,讓內部查詢處理所有票證。
... group by year(eventDate) asc, week(eventDate) asc) TicketCummulative where myYear >= 2015 and myWeek >= 1
如何將Unresolved設置為MySQL,如下所示
set @preCount = 0;
select ticketsB.Year, ticketsB.Week,
IF(@preCount=0, @preCount:=Unresolved, @preCount:=@preCount+Unresolved) as Unresolved from (
SELECT
YEAR(requested) `Year`,
WEEK(requested, 5) `Week`,
count(id) `Unresolved`
FROM
tickets
WHERE
WEEK(requested) < WEEK(resolved)
OR resolved IS NULL
GROUP BY `Year`, `Week`) as ticketsB
請在此處查看結果http://sqlfiddle.com/#!9/90782/61
基本上,您將先前未解析的計數存儲到本地可驗證的數據中,然后根據變量中的內容將未解析的計數添加到下一行。
稀疏的數據集應該得到稀疏的答案,所以這是另一個想到的...
SELECT WEEK(x.requested) wk
, COUNT(y.id)
FROM tickets x
JOIN tickets y
ON y.id <= x.id
AND y.resolved IS NULL
WHERE x.resolved IS NULL
GROUP
BY WEEK(x.requested);
我認為這是一個透視問題。 您需要將查詢提供給報告日期/周。
SELECT
YEAR(requested) `Year`,
WEEK(requested, 5) `Week`,
COUNT(id) `Qty Unresolved`
FROM
tickets
WHERE
WEEK('2015-07-08') <= WEEK(resolved)
or resolved IS NULL
GROUP BY `Year`, `Week`;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.