选择另一个表的最小行

时间:2017-08-29 11:07:43

标签: sql oracle group-by

this question之外,我还要选择其他行。

我有以下表格:

          Table1                         Table2        
CardNo  ID   Record   Date          ID    Name      Dept    
1      101   8.00    11/7/2013      101   Danny     Green   
2      101   13.00   11/7/2013      102   Tanya     Red 
3      101   15.00   11/7/2013      103   Susan     Blue    
4      102   11.00   11/7/2013      104   Gordon    Blue    
5      103   12.00   11/7/2013                  
6      104   12.00   11/7/2013                  
7      104   18.00   11/7/2013                  
8      101    1.00   12/7/2013                  
9      101   10.00   12/7/2013                  
10     102    0.00   12/7/2013                  
11     102    1.00   12/7/2013                  
12     104    3.00   12/7/2013                  
13     104    4.00   12/7/2013  

我希望结果如下:

Name    Dept    Record    Date
Danny   Green   8.00      12/7/2013
Tanya   Red     11.00     11/7/2013
Susan   Blue    12.00     11/7/2013
Gordon  Blue    18.00     12/7/2013

我通过以下选择错误地获得了一个组:

select t2.Name, t2.Dept, min(t1.Record), t1.Date
from table1 t1
join table2 t2 on t2.ID = t1.ID
group by t2.ID, t2.Name, t2.Dept      .

如果我替换t1.Date with min(t1.Date)它看起来很好,但问题是没有选择相应的记录日期。如果你能帮助我,我会很高兴的!

3 个答案:

答案 0 :(得分:2)

您按照与所选列不同的列进行分组,请尝试以下操作:

select t2.Name, t2.Dept, min(t1.Record), t1.Date
from table1 t1
join table2 t2 on t2.ID = t1.ID
group by t2.Name, t2.dept, t1.date

答案 1 :(得分:0)

以下是使用RANK的选项:

SELECT
    t.Name,
    t.Dept,
    t.Record,
    t.Date
FROM
(
    SELECT t1.*, t2.*,
        RANK() OVER (PARTITION BY t2.ID ORDER BY t2.Record) rank
    FROM Table2 t2
    INNER JOIN Table1 t1
        ON t1.ID = t2.ID
) t
WHERE t.rank = 1;

答案 2 :(得分:0)

你必须确保两件事。结果集中的每个非聚合列必须在组中出现。现在,您的结果集中只能有一个名称dept组合。所以你必须确保只有一行t1。 Normaly你会选择包含记录被破坏的第一个日期的行:

  select t2.name,
         t2.dept,
         min(t1.record) as record,
         min(t1.date)   as date
    from t1
    join t2 on t2.id = t1.id
group by t1.id, t2.name, t2.dept