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)