【问题标题】:Comparing two latest rows and return true or false based on location_id比较两个最新的行并根据 location_id 返回 true 或 false
【发布时间】:2019-11-21 03:03:11
【问题描述】:

我有包含三个字段的表名 Locations。我需要根据 last_update_date 找到特定人员 id 的最新两行,并比较这两个最新行的 location_id,如果 location_id 相同则返回 true,否则返回 false。

我尝试使用 join 编写查询,但似乎没有解决我的问题。

表格片段。 片段1:

Locations       
person_id   last_update_date              location_id
368         21/10/08 14:37                     234
368         28-02-00 06:18:12.000000000 AM     431
368         11-02-98 03:56:33.000000000 AM     431
368         13-01-98 08:50:37.000000000 AM     212

片段2:

person_id   last_update_date              location_id
368         21/10/08 14:37                     null
368         28-02-00 06:18:12.000000000 AM     431
368         11-02-98 03:56:33.000000000 AM     431
368         13-01-98 08:50:37.000000000 AM     212

片段3:

person_id   last_update_date              location_id
368         21/10/08 14:37                     431
368         28-02-00 06:18:12.000000000 AM     431
368         11-02-98 03:56:33.000000000 AM     431
368         13-01-98 08:50:37.000000000 AM     212

片段4:

person_id   last_update_date              location_id
368         21/10/08 14:37                     431

对于上面的表 sn-p1,person id 368 的两个最新行是前两行没有相同的 location_id,所以在这种情况下我想返回 false。请帮助我进行相同的 oracle 查询。 Snippet2,查询应返回 false。 Snippet3,查询应返回 true。 Snippet4,查询应返回 false,因为没有其他具有相同 person_id 的行可比较。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    这是一种选择; test CTE 是你已经拥有的,有用的代码从第 7 行开始。

    SQL> with locations (person_id, last_update_date, location_id) as
      2    (select 368, to_date('21.10.2008 14:37', 'dd.mm.yyyy hh24:mi'), 234 from dual union all
      3     select 368, to_date('28.02.2000 06:18', 'dd.mm.yyyy hh24:mi'), 431 from dual union all
      4     select 368, to_date('11.02.1998 03:56', 'dd.mm.yyyy hh24:mi'), 431 from dual union all
      5     select 368, to_date('13.01.1998 08:50', 'dd.mm.yyyy hh24:mi'), 212 from dual
      6    ),
      7  temp as
      8    (select person_id, last_update_date, nvl(location_id, -1) location_id,
      9       row_number() over (partition by person_id order by last_update_date desc) rnd
     10     from locations
     11    )
     12  select person_id,
     13         min(last_update_date) min_date,
     14         max(last_update_date) max_date,
     15         case when min(location_id) <> max(location_id) or count(*) = 1 then 'false'
     16              else 'true'
     17         end flag
     18  from temp
     19  where rnd <= 2
     20  group by person_id;
    
     PERSON_ID MIN_DATE   MAX_DATE   FLAG
    ---------- ---------- ---------- -----
           368 28.02.2000 21.10.2008 false
    
    SQL>
    

    [编辑:如何使用 CTE]

    CTE(公用表表达式,或带有因式分解子句)有它的语法。你不能发明你自己的。

    不像你用的那样:

    (SELECT person_id,
            last_update_date,
            location_id,
            ROW_NUMBER ()
               OVER (PARTITION BY person_id ORDER BY last_update_date DESC)
               rnd
       FROM locations)
     as temp, select pid, ...
    

    但是

    WITH temp
         AS (SELECT person_id,
                    last_update_date,
                    location_id,
                    ROW_NUMBER ()
                    OVER (PARTITION BY person_id ORDER BY last_update_date DESC)
                       rnd
               FROM locations)
      SELECT pid, ...
    

    【讨论】:

    • 你能帮我准确的 oracle 查询吗?我正在尝试以下查询,但似乎是一些语法错误。 (select person_id, last_update_date, location_id, row_number() over (partition by person_id order by last_update_date desc) rnd from locations) as temp, select pid, min(last_update_date) min_date, max(last_update_date) max_date, case when min(location_id) max(location_id) then 'false' else 'true' end flag from temp where rnd
    • 这个精确的Oracle查询;我只是缩短了列名。我已经编辑了我的消息,以便它反映您在问题中发布的名称。看看吧。
    • 你能在评论中检查我的查询,看看我的语法哪里出错了,我好像不能在这个查询中使用“as temp”。
    • 您误用了 CTE 语法。我(再次)编辑了我的消息,显示你做错了什么。
    • 感谢您的纠正,对我来说,最新的行 location_id 也可以为 null,在这种情况下,此查询返回 true,但我期望在这种情况下为 false,因为 null 不能等于到任何值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    相关资源
    最近更新 更多