簡體   English   中英

如何在MySQL中計算每周符合條件的行?

[英]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
    );

通過更改輸入周,可以獲得任何感興趣的一周的未解決的票數。 我的目標是創建一個查詢,按周對所有可用數據進行分組,而不是修改此查詢以獲得單周結果。

(注意:我正在展示我的思考過程,但您只需要在此答案中進行最終查詢)

(注2:在這里檢查sqlfiddle

我會把請求的票證和票證分解為兩種不同類型的事件,所以

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM