簡體   English   中英

從GROUP BY獲取一天中最大和最小時間的ID行

[英]Get id row with MAX and MIN time in day from a GROUP BY

我不知道如何獲取此信息。

這是我的查詢

SELECT
    CAST(reports.report_creation_datetime AS DATE) AS report_date,
    MIN(CAST(reports.report_creation_datetime AS TIME)) AS work_start, <--- I want to get id of this row
    MAX(CAST(reports.report_creation_datetime AS TIME)) AS work_end    <--- and this
FROM       reports
WHERE      reports.report_creation_datetime >= '2016-02-01'
AND        reports.report_creation_datetime < LAST_DAY('2016-02-01') + INTERVAL 1 DAY
GROUP BY   CAST(reports.report_creation_datetime AS DATE)

樣本數據

---reports table
report_id     report_creation_datetime
 ------------------------------------
   82           2016-02-01 07:20:00
   80           2016-02-01 10:30:00
   85           2016-02-01 17:00:00
   88           2016-02-02 08:00:00
   87           2016-02-02 16:00:00
   81           2016-02-03 10:50:00

我想得到

---expected result
report_date      work_start      wstart_id     ...
 -------------------------------------------------------
 2016-02-01       07:20:00          82         ...
 2016-02-02       08:00:00          88         ...
 2016-02-03       10:50:00          81         ...
 ...
 2016-02-29       07:30:00          199        ...

我考慮這樣的子查詢WHERE date = MIN(date),但它是不正確的

有兩種不同的方法可以做到這一點。 您可以join使用表回到自身aggregation在兩個子查詢。 您可以使用user-defined variables

也許最簡單的解決方案是2個相關的子查詢:

SELECT
    CAST(r.report_creation_datetime AS DATE) AS report_date,
    MIN(CAST(r.report_creation_datetime AS TIME)) AS work_start,
    (SELECT id FROM reports r2 
    WHERE CAST(r.report_creation_datetime AS DATE) = CAST(r2.report_creation_datetime AS DATE) 
    ORDER BY r2.report_creation_datetime 
    LIMIT 1) work_start_id,
    MAX(CAST(reports.report_creation_datetime AS TIME)) AS work_end,
    (SELECT id FROM reports r3 
    WHERE CAST(r.report_creation_datetime AS DATE) = CAST(r3.report_creation_datetime AS DATE) 
    ORDER BY r3.report_creation_datetime DESC
    LIMIT 1) work_end_id
FROM       reports r
WHERE      r.report_creation_datetime >= '2016-02-01'
AND        r.report_creation_datetime < LAST_DAY('2016-02-01') + INTERVAL 1 DAY
GROUP BY   CAST(r.report_creation_datetime AS DATE)

這是一個也應該返回領帶的替代方法:

SELECT t.report_date, t.work_start, t.work_end, r1.id minid, r2.id maxid 
FROM (
    SELECT
        CAST(reports.report_creation_datetime AS DATE) AS report_date,
        MIN(CAST(reports.report_creation_datetime AS TIME)) AS work_start,
        MAX(CAST(reports.report_creation_datetime AS TIME)) AS work_end
    FROM       reports
    WHERE      reports.report_creation_datetime >= '2016-02-01'
    AND        reports.report_creation_datetime < LAST_DAY('2016-02-01') + INTERVAL 1 DAY
    GROUP BY   CAST(reports.report_creation_datetime AS DATE)
) t 
    JOIN reports r1 ON t.report_date = CAST(r1.report_creation_datetime AS DATE) AND t.work_start = CAST(r1.report_creation_datetime AS TIME)
    JOIN reports r2 ON t.report_date = CAST(r2.report_creation_datetime AS DATE) AND t.work_end = CAST(r2.report_creation_datetime AS TIME)

您想實現這樣的目標嗎? (未測試)

SELECT distinct CAST(mainReports.report_creation_datetime AS DATE) AS 
report_date, workStartReports.id as StartId, workEndReports.id as EndId FROM
(SELECT MIN(CAST(report_creation_datetime AS TIME)) as minDate,
MAX(CAST(report_creation_datetime AS TIME)) as maxDate From reports WHERE
report_creation_datetime >= '2016-02-01' AND report_creation_datetime < 
LAST_DAY('2016-02-01') + INTERVAL 1 DAY) as MinMaxDates, reports as 
mainReports, reports as workStartReports, reports as workEndReports WHERE
 mainReports.report_creation_datetime >= '2016-02-01' AND 
mainReports.report_creation_datetime < LAST_DAY('2016-02-01') + INTERVAL 1 DAY 
AND workStartReports.report_creation_datetime = MinMaxDates.minDate AND 
workEndReports.report_creation_datetime = MinMaxDates.maxDate

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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