【问题标题】:SQL Query with MIN function is Returning Multiple Rows带有 MIN 函数的 SQL 查询返回多行
【发布时间】:2013-12-31 15:03:21
【问题描述】:
我正在尝试从表格中选择日期最短的行的预计小时数。
SELECT prev_est_hrs
FROM ( SELECT MIN(change_date), prev_est_hrs
FROM task_history
WHERE task_id = 5
GROUP BY prev_est_hrs
);
但是这会返回两行,为什么?我以为 MIN 应该只返回最低值?
非常感谢您的帮助。
【问题讨论】:
标签:
sql
oracle
select
group-by
min
【解决方案1】:
您有一个GROUP BY 子句。 MIN 将返回每组中的最小值。
另外,您只是从外部 SELECT 中按值返回分组。
【解决方案2】:
米奇是对的。使用最早的change_date 记录prev_est_hrs 的一种方法是使用analytic function:
SELECT prev_est_hrs
FROM (
SELECT prev_est_hrs, ROW_NUMBER() OVER (ORDER BY change_date) AS rn
FROM task_history
WHERE task_id = 5
)
WHERE rn = 1;
您需要考虑如果有两行具有相同的日期会发生什么。这将随机选择其中之一。如果您可以使用其他一些标准来打破平局,您可以将其添加到order by 子句中。如果你想要在这种情况下所有匹配的行,你可以使用 rank() 代替;看看dense_rank(),他们都有自己的位置。
【解决方案3】:
使用这个查询来做到这一点:
SELECT max(prev_est_hrs) keep (dense_rank first order by change_date)
FROM task_history
WHERE task_id = 5;