代码之家  ›  专栏  ›  技术社区  ›  Paul Tomblin

从另一个表中按最大值或最小值排序

  •  2
  • Paul Tomblin  · 技术社区  · 14 年前

    我有一个由唯一ID和一些其他属性组成的表。它保存着“时间表”。然后我有另一张表,上面列出了每个日程表已经或将要“启动”的所有时间。这不是确切的模式,但很接近:

    create table schedule (
       id varchar(40) primary key,
       attr1 int,
       attr2 varchar(20)
    );
    
    create table schedule_times (
       id varchar(40) foreign key schedule(id),
       fire_date date
    );
    

    我想查询进度表,在Java中获取属性和下一个和以前的FieldDebug,有时对其中一个属性进行排序,但有时在前一个防火墙日期或下一个FieldDead上排序。按属性排序很容易,在构建准备好的语句时,我只需在字符串中插入“order by”。我甚至不知道如何在单个查询中选择最后一个火灾日期和下一个火灾日期-我知道通过执行

    SELECT   min(fire_date)
    FROM     schedule_times
    WHERE    id = ? AND
             fire_date > sysdate;
    

    和以前的火灾日期一样 max() fire_date < sysdate . 我只是画了一个空白,关于如何将它合并到一个从时间表中选择,这样我就可以在一次拍摄中同时获得下一个和上一个拍摄日期,以及如何按这些属性中的任何一个排序。

    3 回复  |  直到 14 年前
        1
  •  4
  •   Peter Lang    14 年前

    您可以使用 Left Join S.
    这有返回的好处 NULL 如果没有下一个/上一个日程安排,则为您的火灾日期。

    Select id, attr1, attr2, next_fire_date, previous_fire_date
    From schedule s
    Left Join ( Select id, Min(fire_date) As next_fire_date
                From schedule_times st
                Where st.fire_date > Sysdate
                Group By id ) n
        On ( n.id = s.id )
    Left Join ( Select id, Max(fire_date) As previous_fire_date
                From schedule_times st
                Where st.fire_date < Sysdate
                Group By id ) p
        On ( p.id = s.id )
    

    然后您可以添加 ORDER BY next_fire_date previous_fire_date .


    如果性能很重要,请在 schedule_times( id, fire_date ) ,这将允许子查询从此索引中只读。

        2
  •  3
  •   Jeffrey Kemp    14 年前

    尝试如下操作:

    select schedule.*,
    (
        select max(si.fire_date) from schedule_times si where si.id = schedule.id and si.fire_date < sysdate
    ) as prevfire,
    
    (
        select min(si.fire_date) from schedule_times si where si.id = schedule.id and si.fire_date > sysdate
    ) as nextfire
    from schedule
    where id = ?
    order by attr1
    
        3
  •  0
  •   Bharat    14 年前

    将查询修改为

    选择 独特的 S.ID,附件1,附件2, 铅(火灾日期,1, 相册 )下一个火灾日期, 滞后(火灾日期,1, 辛酸盐 )上一个火灾日期 从计划S,计划时间ST,其中ST.ID=S.ID;

    这是一个简单的查询。你可以试试这个。

    Lead能够计算下一行(将在当前行之后出现的行)的表达式,并将值返回到当前行。铅的一般语法如下:

    lead(sql_expr,offset,default)over(analysis_子句)

    1. QLXEXPR 从前导行计算的表达式。
    2. 抵消 是前导行相对于当前行的索引 行。偏移量为正整数 默认值为1。
    3. 违约 偏移量指向行时返回的值 超出分区范围。

    LAG的语法类似,只是LAG的偏移量进入前几行。