Mysql:在一行中获取一个字段的最高值和另一个字段的最低值

标签 mysql max min

我有一个包含两个日期/时间字段的 (MySQL) 表:startend(每个类型都是 datetime)。我需要一个查询,为特定用户和定义的日期提供从 start 开始的最低值和 end 的最高值。我终于成功地进行了以下查询:

SELECT job.id, job.user_id, job.start, last.end 
FROM job
    JOIN job AS last 
        ON job.user_id = last.user_id 
            AND DATE( job.start ) = DATE( last.start ) 
            AND last.end = (SELECT max( last2.end) 
                            FROM job AS last2 
                            WHERE last2.user_id = last.user_id 
                                AND DATE( last2.end ) = DATE( last.end ))
WHERE job.user_id = 1 
    AND DATE( job.start ) = '2012-05-28' 
ORDER BY job.start ASC 
LIMIT 0,1

尽管它有效,但它“感觉”不对。有没有更简单的方法来做到这一点? 非常感谢任何帮助和提示。谢谢!

示例数据:

user_id     start               end
1       2012-05-28 07:13:00     2011-04-26 07:45:00
1       2012-05-28 08:15:00     2011-04-26 08:50:00
1       2012-05-28 05:32:00     2011-04-26 05:51:00
1       2012-05-28 08:50:00     2011-04-26 09:50:00
1       2012-05-28 15:10:00     2011-04-26 15:40:00
1       2012-05-27 16:11:00     2011-04-26 16:46:00
2       2012-05-28 09:50:00     2011-04-26 10:35:00

最佳答案

Select user_id
  , Min( start ) As MinStart
  , Max( end ) As MaxEnd
From job
Where Date( start ) = '2012-05-28'
  And user_id = 1
Group By user_id, Date( start )

根据您的评论,{1, 2012-5-28 5:32:00 2011-04-26 15:40:00} 是预期的输出(这就是示例输出的原因如此重要),这表明开始和结束日期值不一定与实际行的值相关。例如,示例数据中没有包含值组合的行。鉴于此,解决方案更简单。

我对 Date( start ) 进行分组只是为了表明如果删除 Where 子句,则可以按开始日期确定最短和最长开始日期。鉴于您正在对两者进行过滤,您可以将查询简化为:

Select user_id
  , Min( start ) As MinStart
  , Max( end ) As MaxEnd
From job
Where Date( start ) = '2012-05-28'
  And user_id = 1
Group By user_id

SQL Fiddle版本

关于Mysql:在一行中获取一个字段的最高值和另一个字段的最低值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10777711/

相关文章:

R:如何获取时间序列数据中日期时间列的最大值

python - 为什么这个函数与 min 一起工作,而不是没有?

sql - 如何返回一个结果集中的最小和最大记录 (Microsoft Access)

c - 当左右 child 相等且小于其 parent 时,我应该怎么做才能从最小堆中删除一个值

c++ - Omnet + MySQL 不工作

mysql - 使用 WP_Query 编写查询

Mysql查询查找一列满足多个条件的ID

c++ - 结合 mysql_real_escape 字符串与 sprintf

c - 最大行长度程序在 c 中打印不可读的字符

python - 在整个数据框中查找最大值和相应的列/索引名称