Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择按日期分组的最大分数,显示完整日期时间_Sql_Database_Oracle_Greatest N Per Group - Fatal编程技术网

Sql 选择按日期分组的最大分数,显示完整日期时间

Sql 选择按日期分组的最大分数,显示完整日期时间,sql,database,oracle,greatest-n-per-group,Sql,Database,Oracle,Greatest N Per Group,格迪,我有一个表格,显示了一系列分数和分数发生的日期时间。 我想为每天选择这些分数的最大值,但显示分数出现的日期时间 我使用的是Oracle database 10g,表的结构如下: 我不能仅仅因为同一个高分可能已经在一天中多次达到而以分数加入 我感谢你的帮助 西蒙·爱德华兹(Simon Edwards)您可能需要两个SELECT语句来实现这一点:第一个用于收集截断的日期和关联的最大分数,第二个用于获取与分数关联的实际日期时间值 尝试: 这也将带来最好的比分平局 对于仅为每天选择最近发布的高分

格迪,我有一个表格,显示了一系列分数和分数发生的日期时间。 我想为每天选择这些分数的最大值,但显示分数出现的日期时间

我使用的是Oracle database 10g,表的结构如下:

我不能仅仅因为同一个高分可能已经在一天中多次达到而以分数加入

我感谢你的帮助


西蒙·爱德华兹(Simon Edwards)

您可能需要两个SELECT语句来实现这一点:第一个用于收集截断的日期和关联的最大分数,第二个用于获取与分数关联的实际日期时间值

尝试:

这也将带来最好的比分平局

对于仅为每天选择最近发布的高分的版本:

SELECT T.ScoreDateTime, T.Score
FROM
(
 SELECT
    TRUNC(T.ScoreDateTime) ScoreDate, 
    MAX(T.score) BestScore, 
    MAX(T.ScoreDateTime) BestScoreTime
 FROM 
    MyTable T
 GROUP BY 
    TRUNC(T.ScoreDateTime)
) ByDate
INNER JOIN MyTable T 
    ON T.ScoreDateTime = ByDate.BestScoreTime and T.Score = ByDate.BestScore
ORDER BY T.ScoreDateTime DESC

如果在同一时间发布两个不同的分数,则每个日期可能会产生多个记录。

您可能需要两个SELECT语句来完成此操作:第一个语句收集截断的日期和关联的最大分数,第二个语句提取与分数关联的实际日期时间值

with mytableRanked(d,scoredatetime,score,rk) as (
  select
    scoredatetime,
    score,
    row_number() over (
      partition by trunc(scoredatetime)
      order by score desc, scoredatetime desc
    )
  from mytable
)
  select
    scoredatetime,
    score
  from mytableRanked    
  where rk = 1
  order by date desc
尝试:

这也将带来最好的比分平局

对于仅为每天选择最近发布的高分的版本:

SELECT T.ScoreDateTime, T.Score
FROM
(
 SELECT
    TRUNC(T.ScoreDateTime) ScoreDate, 
    MAX(T.score) BestScore, 
    MAX(T.ScoreDateTime) BestScoreTime
 FROM 
    MyTable T
 GROUP BY 
    TRUNC(T.ScoreDateTime)
) ByDate
INNER JOIN MyTable T 
    ON T.ScoreDateTime = ByDate.BestScoreTime and T.Score = ByDate.BestScore
ORDER BY T.ScoreDateTime DESC
如果在同一时间发布两个不同的分数,则每个日期可能会产生多个记录

with mytableRanked(d,scoredatetime,score,rk) as (
  select
    scoredatetime,
    score,
    row_number() over (
      partition by trunc(scoredatetime)
      order by score desc, scoredatetime desc
    )
  from mytable
)
  select
    scoredatetime,
    score
  from mytableRanked    
  where rk = 1
  order by date desc
如果一天内有多个高分,则返回与当天最晚出现的高分对应的行。如果要查看一天中的所有最高分数,请在“行数”窗口中从“按规格排序”中删除scoredatetime desc

或者,您也可以这样做,它将列出日期的高分领带:

select
  scoredatetime,
  score
from mytable
where not exists (
  select *
  from mytable as M2
  where trunc(M2.scoredatetime) = trunc(mytable.scoredatetime)
  and M2.score > mytable.scoredatetime
)
order by scoredatetime desc
如果一天内有多个高分,则返回与当天最晚出现的高分对应的行。如果要查看一天中的所有最高分数,请在“行数”窗口中从“按规格排序”中删除scoredatetime desc

或者,您也可以这样做,它将列出日期的高分领带:

select
  scoredatetime,
  score
from mytable
where not exists (
  select *
  from mytable as M2
  where trunc(M2.scoredatetime) = trunc(mytable.scoredatetime)
  and M2.score > mytable.scoredatetime
)
order by scoredatetime desc

首先,您还没有指定如果在同一天内有两行或更多行包含相同的高分,将发生什么情况

这个问题有两个可能的答案:

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.
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.
2选择所有得分最高的记录

在这种情况下,您需要使用秩或稠密秩函数进行分析。例如:

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.
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.
问候,,
Rob。

首先,您还没有指定如果同一天内两行或更多行包含相同的高分,应该怎么做

这个问题有两个可能的答案:

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.
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.
2选择所有得分最高的记录

在这种情况下,您需要使用秩或稠密秩函数进行分析。例如:

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.
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.
问候,,
罗伯。

谢谢大卫!如果我希望每天只得到一个分数,并将当天的最高分数作为名义上的“最大值”,我会使用您提供的解决方案,我怀疑事情会变得更加混乱。干杯。@Simon:这不会更混乱,您需要在内部查询中捕获MAXT.ScoreDateTime,并将该字段用作联接条件的一部分。很高兴这对你有用!谢谢你,大卫!如果我希望每天只得到一个分数,并将当天的最高分数作为名义上的“最大值”,我会使用您提供的解决方案,我怀疑事情会变得更加混乱。干杯。@Simon:这不会更混乱,您需要在内部查询中捕获MAXT.ScoreDateTime,并将该字段用作联接条件的一部分。很高兴这对你有用!