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的解决方案中获得相同的结果,而无需访问基表两次。