我试图获得每个id的最小日期,但不给我结果。 Plz看到我试过的样本数据和查询。
在Oracle上:11G
表:
create table gr(id number, dept number, sal number, dates date);
样本数据:
Id DEPT Sal Dates
1 10 5000 02-MAR-2018 16:34:46
1 10 2000 04-MAR-2018 16:34:46
1 10 1000 05-MAR-2018 16:34:46
1 10 (null) 06-MAR-2018 16:34:46
2 20 2000 07-MAR-2018 16:34:46
2 20 5000 08-MAR-2018 16:34:46
2 20 (null) 09-MAR-2018 16:34:46
3 30 1000 10-MAR-2018 16:34:46
3 30 1400 11-MAR-2018 16:34:46
3 30 3000 12-MAR-2018 16:34:46
3 30 (null) 13-MAR-2018 16:34:46
4 40 4000 14-MAR-2018 16:34:46
4 40 5000 15-MAR-2018 16:34:46
4 40 (null) 16-MAR-2018 16:34:46
在此表上查看:
create view gview as
select id, sal, (Case when sal >= 5000 Then 'High Paid'
when Sal < 5000 Then 'Low Paid' End) As Status,
dates
from gr
当我试图为每个id获得min Sal时,以下工作完美。
select g1.Id, Min(g1.Sal), g1.Status
from gview g1 join gview g2 on g1.id=g2.id
where g1.Sal < g2.Sal
group by g1.Id, g1.Status
输出:
ID MIN(G1.SAL) STATUS
1 1000 Low Paid
3 1000 Low Paid
2 2000 Low Paid
4 4000 Low Paid
然而,当我试图获得每个id的最小日期时,它并没有给我任何结果。
select g1.Id, g1.Sal, g1.Status, min(g1.dates)
from gview g1 join gview g2 on g1.id=g2.id
where g1.dates < g2.dates
group by g1.Id, g1.Sal, g1.Status
select g1.Id, g1.Sal, g1.Status, min(g1.dates)
from gview g1 join gview g2 on g1.id=g2.id
where to_char(g1.dates, 'DD-MON-YYYY') < to_char(g1.dates, 'DD-MON-YYYY')
group by g1.Id, g1.Sal, g1.Status
所以,只是想知道我在这里缺少什么?
我需要获取每个id的最小日期行。预期成绩:
Id Sal Status min_date
-- ---- --------- ---------
1 5000 High Paid 02-MAR-2018 16:34:46
2 2000 Low Paid 07-MAR-2018 16:34:46
3 1000 Low Paid 10-MAR-2018 16:34:46
感谢您的帮助!
你已经发布了一些预期的结果,所以至少我们可以弄清楚你想要做什么。您希望在视图中获取具有ID最小日期的记录。
你想要行中的所有列,所以你不能简单地在min(dates)
上使用GROUP BY,因为你已经发现:
select g1.Id, g1.Sal, g1.Status, min(g1.dates)
from gview g1 join gview g2 on g1.id=g2.id
where g1.dates < g2.dates
group by g1.Id, g1.Sal, g1.Status
这种方法适用于您之前的查询,因为sal
和status
之间存在关系。它现在不适合你,因为dates
和sal
之间没有任何关系,所以你的GROUP BY不会减少到一行。
这类问题有各种解决方案。最明显的是使用子查询来派生最小日期并将其加入您的视图:
select g1.*
from gview g1
join ( select id, min(dates) as min_date
from gr
group by id ) g2
on g1.id = g2.id
and g1.dates = g2.min_date
order by g1.id;
我正在尝试为每个id获取最小日期
你为什么过于复杂?
select id, min(dates)
from gr
group by id
是你所需要的全部。
其中任何一个都可以帮到你:
通过id从gr组中选择ID,min(date);
选择ID,日期从gr到日期(从gr中选择min(date));
您的视图中没有日期列,因此您无法从视图中获取该日期列。