【问题标题】:Select a row having a column with max value - On a date range选择具有最大值列的行 - 在日期范围内
【发布时间】:2011-02-21 16:30:19
【问题描述】:

请原谅我发布了一个类似的问题。请考虑这一点:

date                 value

18/5/2010, 1 pm        40
18/5/2010, 2 pm        20
18/5/2010, 3 pm        60
18/5/2010, 4 pm        30
18/5/2010, 5 pm        60
18/5/2010, 6 pm        25 
19/5/2010, 6 pm        300 
19/5/2010, 6 pm        450 
19/5/2010, 6 pm        375 
20/5/2010, 6 pm        250 
20/5/2010, 6 pm        310 

查询是获取每一天的日期和值,使得当天获得的值是最大值。如果在当天重复最大值,则选择最低的时间戳。结果应该是这样的:

18/5/2010, 3 pm        60
19/5/2010, 6 pm        450
20/5/2010, 6 pm        310

查询应采用如下所示的日期范围,并以上述方式查找该范围的结果:

在哪里 日期 >= to_date('26/03/2010','DD/MM/YYYY') AND 日期

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    我没有尝试过,但我想你想要这样的东西:

    select max(date)
    from  table
    where date >= to_date('26/03/2010','DD/MM/YYYY') AND date < to_date('27/03/2010','DD/MM/YYYY')
    group by trunc(date)
    

    【讨论】:

    • 感谢您的回复。但是,当我将此查询用于超过 1 天的日期范围时: where date >= to_date('18/03/2010','DD/MM/YYYY') AND date
    【解决方案2】:

    如果您提供 CREATE TABLE 和 INSERT,则可以更轻松地提供经过测试的答案。

    create table i (i_dt date, i_val number);
    
    insert into i values (to_date('18/5/2010 1pm','dd/mm/yyyy hham'),        40);
    insert into i values (to_date('18/5/2010 2pm','dd/mm/yyyy hham'),        20);
    insert into i values (to_date('18/5/2010 3pm','dd/mm/yyyy hham'),        60);
    insert into i values (to_date('18/5/2010 4pm','dd/mm/yyyy hham'),        30);
    insert into i values (to_date('18/5/2010 5pm','dd/mm/yyyy hham'),        60);
    insert into i values (to_date('18/5/2010 6pm','dd/mm/yyyy hham'),        25 );
    insert into i values (to_date('19/5/2010 6pm','dd/mm/yyyy hham'),        300 );
    insert into i values (to_date('19/5/2010 6pm','dd/mm/yyyy hham'),        450 );
    insert into i values (to_date('19/5/2010 6pm','dd/mm/yyyy hham'),        375 );
    insert into i values (to_date('20/5/2010 6pm','dd/mm/yyyy hham'),        250 );
    insert into i values (to_date('20/5/2010 6pm','dd/mm/yyyy hham'),        310 );
    
    select i_dt, i_val from 
       (select i.*, rank() over (partition by trunc(i_dt) order by i_val desc, i_dt asc) rn 
       from i) 
    where rn = 1;
    

    【讨论】:

      【解决方案3】:

      您正在聚合数据,因此请使用分组和聚合函数。您可以添加任何您想要的 where 子句,但我复制了您的 where 子句,更改日期以便选择每条记录。借用 Gary 的 create table 和 insert 语句:

      SQL> select min(i_dt) keep (dense_rank last order by i_val) i_dt
        2       , max(i_val) i_val
        3    from i
        4   where i_dt >= to_date('26/03/2010','dd/mm/yyyy')
        5     and i_dt < to_date('27/05/2010','dd/mm/yyyy')
        6   group by trunc(i_dt)
        7  /
      
      I_DT                     I_VAL
      ------------------- ----------
      18-05-2010 15:00:00         60
      19-05-2010 18:00:00        450
      20-05-2010 18:00:00        310
      
      3 rows selected.
      

      问候, 抢。

      【讨论】:

      • 谢谢。我将如何更改此查询以获得:18-05-2010 15:00:00 60 18-05-2010 17:00:00 60 19-05-2010 18:00:00 450 20-05-2010 18: 00:00 310
      • 您能否编辑您的问题或开始一个新问题,并在您的新输出中包含解释。因为这个评论让我很困惑。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多