Mysql 按从组中获取id行,其中包含每天的最大和最小时间

Mysql 按从组中获取id行,其中包含每天的最大和最小时间,mysql,Mysql,我不知道怎样才能得到这些信息 这是我的问题 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

我不知道怎样才能得到这些信息

这是我的问题

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)
我想去

---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        ...
我这样考虑子查询 其中date=MINdate
但这是不正确的

你想实现这样的目标吗?未经测试

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

有两种不同的方法可以做到这一点。您可以在两个子查询中使用聚合将表连接回自身。您可以使用用户定义的变量

也许最简单的解决方案是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)

你犯了什么错误?如果您能提供示例数据和所需结果,也会很有帮助。我没有任何错误,但我不知道如何获取我称为“工作开始”和“工作结束”的行id。因此,您希望该行包含每天的分组最小报告\u创建\u日期时间值?包含最小日期的行id和包含最大日期的行id每个月的每一天,该查询都返回1111-组函数的使用无效但我甚至没有使用任何group by,你确定你正使用我发布的查询吗?@AshrafIqbal-该错误来自于你在联接中无效使用聚合…该查询返回零结果。对我来说不是,我测试了一个示例数据库表,您确定表中有日期范围的数据吗?2月1日?有太多的疑问了here@Strawberry-OP需要每一天的mintime和相应id以及maxtime和相应id。想发布一个更简单的解决方案吗?我看到3种可能的选择;我提供了我认为最简单的方法。此查询工作正常,但当我在一天内有两个报告使用相同的日期时间时,属性work\u start和work\u end将具有相同的id。解决此问题的简单方法是什么?@Karpol-如果关系是一个有点不同的问题,则不能使用相关子查询方法。相反,您需要多次将表连接到自身。第一个连接是获取最大值,第二个连接是获取最小值。这不太好——基本上取我在相关子查询中得到的,稍微修改一下,然后移动到连接。这将使领带显示出来。@Karpol-用应该包括领带的连接方法更新了答案。
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)