【问题标题】:Select minimum row of another table选择另一个表的最小行
【发布时间】:2018-02-06 19:41:01
【问题描述】:

除了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),它看起来很好,但问题是没有选择相应的记录日期。如果你能帮助我,我会很高兴!

【问题讨论】:

  • 我不明白您的预期输出。你要最小日期还是最小记录?
  • 我想获取对应日期的最小Record。如果遵循 dbajtr 方法,我会得到两行,但只需要一个。
  • 不,你应该得到你想要的结果。

标签: sql oracle group-by


【解决方案1】:

这是一个使用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;

【讨论】:

  • 我遵循了你的方法,但使用了 rank() 并得到了正确的结果。谢谢!
【解决方案2】:

您必须确保两件事。结果集中的每个非聚合列都必须出现在 group by 中。现在,您的结果集中只能有一个名称部门组合。所以你要保证t1只有一行。通常,您将选择包含记录被打破的第一个日期的行:

  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

【讨论】:

  • 但是当min(t1.record)min(t1.date) 的结果没有相同的行号时,这个选择给了我错误的结果。
【解决方案3】:

您正在按不同于您选择的列进行分组,试试这个:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 2018-08-25
    • 2023-01-06
    • 2017-11-13
    • 2021-06-14
    • 2014-10-05
    • 2015-02-15
    相关资源
    最近更新 更多