首先,你並沒有規定什麼應該在相同的發生,如果兩個或更多的行每天都有相同的高分。
兩個可能的答案對這個問題:
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