Sql 使用最小日期的Oracle组

Sql 使用最小日期的Oracle组,sql,oracle,greatest-n-per-group,Sql,Oracle,Greatest N Per Group,我有这样一句话: select REFNUMBER, SomeDate, Somecolumn1, Somecolumn2 from Table 如何选择与按REFNUMBER分组的最低日期关联的行 使用行编号()分析功能: SELECT * FROM ( SELECT REFNUMBER, SomeDate, Somecolumn1, Somecolumn2,

我有这样一句话:

 select REFNUMBER,
        SomeDate,
        Somecolumn1,
        Somecolumn2
 from Table
如何选择与按REFNUMBER分组的最低日期关联的行

使用
行编号()
分析功能:

SELECT *
FROM   (
  SELECT REFNUMBER,
         SomeDate,
         Somecolumn1,
         Somecolumn2,
         ROW_NUMBER() OVER ( PARTITION BY REFNUMBER ORDER BY SomeDate ) As rn
  FROM   Table
)
WHERE  rn = 1
使用
行编号()
分析功能:

SELECT *
FROM   (
  SELECT REFNUMBER,
         SomeDate,
         Somecolumn1,
         Somecolumn2,
         ROW_NUMBER() OVER ( PARTITION BY REFNUMBER ORDER BY SomeDate ) As rn
  FROM   Table
)
WHERE  rn = 1

使用
first/last
聚合函数并避免子查询:

select   refnumber,
         min(somedate)                                              as somedate,
         min(somecolumn1) keep (dense_rank first order by somedate) as somecolumn1,
         min(somecolumn2) keep (dense_rank first order by somedate,
                                                       somecolumn1) as somecolumn2
from     table_name
group by refnumber

使用
first/last
聚合函数并避免子查询:

select   refnumber,
         min(somedate)                                              as somedate,
         min(somecolumn1) keep (dense_rank first order by somedate) as somecolumn1,
         min(somecolumn2) keep (dense_rank first order by somedate,
                                                       somecolumn1) as somecolumn2
from     table_name
group by refnumber

如果一个参考编号下有多个相同的最低日期,则该参考编号将给出所有最小日期行。(不止一个)


如果一个参考编号下有多个相同的最低日期,则该参考编号将给出所有最小日期行。(不止一个)


好奇,避免子查询有好处吗?@PatrickSchomburg-也许(尽管它可能很小)。最好的方法是测试实际数据(而不是小样本)。如果有多行的
somedate
列具有相同的最小值,则可以从不同的行中获取值。设想第1行:
12017-01-01 00:00:00,10,0
和第2行:
12017-01-01 00:00,0,10
,那么输出将是
12017-01-01 00:00:00,0,0
,它从两行获取值。您可以使用聚合中的
orderbysomedate,ROWNUM
来修复它(或者生成行的确定性排序的其他方法,该方法将确保只考虑单行)。@MT0::Right-我不小心。解决此问题的正确方法是将
somecolumn1
添加到应用于
somecolumn2
first
函数中的
order by
。谢谢你指出这一点;大约有一半的时间我记得要做对,而有一半的时间我不记得。好奇,避免子查询有好处吗?@PatrickSchomburg-也许(尽管可能很少)。最好的方法是测试实际数据(而不是小样本)。如果有多行的
somedate
列具有相同的最小值,则可以从不同的行中获取值。设想第1行:
12017-01-01 00:00:00,10,0
和第2行:
12017-01-01 00:00,0,10
,那么输出将是
12017-01-01 00:00:00,0,0
,它从两行获取值。您可以使用聚合中的
orderbysomedate,ROWNUM
来修复它(或者生成行的确定性排序的其他方法,该方法将确保只考虑单行)。@MT0::Right-我不小心。解决此问题的正确方法是将
somecolumn1
添加到应用于
somecolumn2
first
函数中的
order by
。谢谢你指出这一点;大约一半的时间我记得要做对,一半的时间我没有。相同的结果-不需要访问基表两次-可以通过使用
rank()
densed\u rank()
(在这种情况下,它们将给出相同的结果)而不是
行数()从MT0的解决方案中获得
。通过使用
rank()
densite\u rank()
(在这种情况下,它们将给出相同的结果)而不是
row\u number()
,可以从MT0的解决方案中获得相同的结果,而无需访问基表两次。