首先,你并没有规定什么应该在相同的发生,如果两个或更多的行每天都有相同的高分。
两个可能的答案对这个问题:
1)只要选择scoredatetime的之一,它并不重要的一个
在这种情况下,不要使用自加入或分析,你在看其他答案,因为有一个特殊的聚合函数可以使你的工作更有效率。举例:
SQL> create table mytable (scoredatetime,score)
2 as
3 select to_date('01-jan-2009 00:10:00','dd-mon-yyyy hh24:mi:ss'), 10 from dual union all
4 select to_date('01-jan-2009 01:00:00','dd-mon-yyyy hh24:mi:ss'), 11 from dual union all
5 select to_date('01-jan-2009 04:00:00','dd-mon-yyyy hh24:mi:ss'), 9 from dual union all
6 select to_date('02-jan-2009 00:10:00','dd-mon-yyyy hh24:mi:ss'), 1 from dual union all
7 select to_date('02-jan-2009 01:00:00','dd-mon-yyyy hh24:mi:ss'), 1 from dual union all
8 select to_date('02-jan-2009 04:00:00','dd-mon-yyyy hh24:mi:ss'), 0 from dual
9/
Table created.
SQL> select max(scoredatetime) keep (dense_rank last order by score) scoredatetime
2 , max(score)
3 from mytable
4 group by trunc(scoredatetime,'dd')
5/
SCOREDATETIME MAX(SCORE)
------------------- ----------
01-01-2009 01:00:00 11
02-01-2009 01:00:00 1
2 rows selected.
2)选择所有最高分的记录。
在这种情况下,您需要使用RANK或DENSE_RANK函数进行分析。举例:
SQL> select scoredatetime
2 , score
3 from (select scoredatetime
4 , score
5 , rank() over (partition by trunc(scoredatetime,'dd') order by score desc) rnk
6 from mytable
7 )
8 where rnk = 1
9/
SCOREDATETIME SCORE
------------------- ----------
01-01-2009 01:00:00 11
02-01-2009 00:10:00 1
02-01-2009 01:00:00 1
3 rows selected.
Regards, Rob。
谢谢大卫! 我怀疑事情会变得更加混乱,如果我想每天得到一个单独的分数(并且将当天的最高分作为名义上的“最大”),我将使用您提供的解决方案。干杯。 – 2009-09-21 04:16:21
@Simon:它不会更混乱,您需要在内部查询中捕获MAX(T.ScoreDateTime),并将该字段用作JOIN条件的一部分。很高兴为您效力! – 2009-09-21 04:36:03