Oracle中的查询问题

问题描述 投票:-2回答:3

我试图获得每个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 

感谢您的帮助!

oracle
3个回答
0
投票

你已经发布了一些预期的结果,所以至少我们可以弄清楚你想要做什么。您希望在视图中获取具有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

这种方法适用于您之前的查询,因为salstatus之间存在关系。它现在不适合你,因为datessal之间没有任何关系,所以你的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;

Here is a SQLFiddle demo.


2
投票

我正在尝试为每个id获取最小日期

你为什么过于复杂?

select id, min(dates)
from gr
group by id

是你所需要的全部。


0
投票

其中任何一个都可以帮到你:

通过id从gr组中选择ID,min(date);

选择ID,日期从gr到日期(从gr中选择min(date));

您的视图中没有日期列,因此您无法从视图中获取该日期列。

© www.soinside.com 2019 - 2024. All rights reserved.