使用Oracle SQL,我想根据参加考试的时间来选择一组人员的ID,考试日期和考试结果。我的问题是优先顺序不是按时间顺序排列的。我想在1年中选择一个日期。如果他们在1年中没有日期,我想要3年中的日期。如果他们没有1或3年,我想要2年中的日期。
我使用了一个case函数来创建一个变量(check1),以根据进行测试的年份的优先级为每行分配一个值。因此,所有行在check1列中都有1、2或3。 (1是最高优先级,3是最低优先级。)
我知道使用以下方法可以分为几类:
function format_url($url, $page) {
$x = parse_url($page);
$urlX = explode('/', $url);
$name = end($urlX);
if(strpos($url, 'http') === 0) {
} else if(strpos($url, '//') === 0) {
$url = 'https:'.$url;
} else {
// RELATIVE URL
// ROOT FOLDER
if(strpos($url, '/') === 0) {
$url = $x['scheme'].'://'.$x['host'].$url;
} else {
$url = rel2abs($url, $page);
}
}
return $url;
}
这是我的问题:我还需要他们参加考试的日期,以便我可以将正确的考试结果加入到希望的日期。当我尝试将日期添加到上一个功能时:
SELECT ID, MIN(check1)
FROM datatable
GROUP BY ID;
Oracle错误,因为date变量不在GROUP BY函数中。但是,当我按功能将日期放入分组时,它将选择所有记录,而不仅仅是min(check1)。
如何获取每人要选择日期的一行?
提前谢谢!
答案 0 :(得分:2)
最快的方法通常是相关子查询:
SELECT t.*
FROM datatable t
WHERE t.date = (SELECT MIN(t2.check1) FROM datatable t2 WHERE t2.id = t.id);
或者,使用KEEP
进行聚合:
select id, min(check1), min(date) keep (dense_rank first order by check1 asc) as date
from datatable t
group by id;