簡體   English   中英

使用ORACLE SQL查詢不同行中的數據

[英]Querying data from different rows using ORACLE SQL

我有這張桌子:

+------+-------+---------+----------------------------+
| id   | date  | value   |  value2 | value3           |
+------+-------+---------+----------------------------+
| 1    | 5/28  | 100     | NULL    | NULL             |
| 1    | 5/27  | 200     | NULL    | NULL             |
| 1    | 5/26  | 300     | 10      | NULL             |
| 1    | 5/25  | NULL    | NULL    | NULL             |
| 1    | 5/24  | ...     | 20      | NULL             |
| 1    | 5/23  | ...     | ....    | 50               |
| 1    | 5/22  | ...     | ....    | 30               |
| 1    | 5/21  | ...     | ....    | NULL             |
| 1    | 5/20  | ...     | ....    | ...              |
| 1    | 5/19  | ...     | ....    | ...              |
| 1    | 5/18  | ...     | ....    | ...              |
| 1    | 5/17  | ...     | ....    | ...              |
+------+-------+--------------------------------------+

我需要查詢每列的最新可能值。 因此,如果在value3不為一天的那一天value2為NULL,它將獲取先前的記錄,其中value2不為null。 我不確定這是否有意義,但這是我想要的結果表:

+------+-------+-------+--------+----------+
| id   | date  | value | value2 |  value3  |
+------+-------+-------+--------+----------+
| 1    | 5/28  | 100   | 10     | 50       |
+------+-------+---------------------------+

日期將始終為最新日期(在本示例中為5/28),對於其余日期,我需要獲取每列的最新值,即使它與日期不匹配。

這有可能嗎?

這是一個選擇:

SQL> alter session set nls_date_format = 'dd.mm.yyyy';

Session altered.

SQL> with test (datum, value1, value2, value3) as
  2    (select date '2018-05-28', 100, null, null from dual union
  3     select date '2018-05-27', 200, null, null from dual union
  4     select date '2018-05-26', 300, 10, null   from dual union
  5     select date '2018-05-23', 500, null, 50   from dual
  6    ),
  7  inter as
  8    (select
  9      first_value(datum  ignore nulls) over (order by datum desc) datum,
 10      first_value(value1 ignore nulls) over (order by datum desc) value1,
 11      first_value(value2 ignore nulls) over (order by datum desc) value2,
 12      first_value(value3 ignore nulls) over (order by datum desc) value3
 13    from test
 14    order by 1 desc nulls last, 2 desc nulls last, 3 desc nulls last, 4 desc nulls last
 15   )
 16  select *
 17  from inter
 18  where rownum = 1;

DATUM          VALUE1     VALUE2     VALUE3
---------- ---------- ---------- ----------
28.05.2018        100         10         50

SQL>

last_value窗口函數也可以用於此目的。

例:

 create table test_table(id int, "date" date, value int, value2 int, value3 int); 
 insert into test_table (id, "date", value, value2, value3) select 1, date '2018-05-28', 100, null, null from dual union select 1, date '2018-05-27', 200, null, null from dual union select 1, date '2018-05-26', 300, 10, null from dual union select 1, date '2018-05-23', 500, null, 50 from dual; 
 insert into test_table (id, "date", value, value2, value3) select 2, "date" + 1, value+100, value2+10, value3+10 from test_table; 
 select id, max("date") as "date", max(lastValue1) as value, max(lastValue2) as value2, max(lastValue3) as value3 from ( select id, "date", last_value(value ignore nulls) over (partition by id order by "date" ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as lastValue1, last_value(value2 ignore nulls) over (partition by id order by "date" ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as lastValue2, last_value(value3 ignore nulls) over (partition by id order by "date" ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as lastValue3 from test_table ) q group by id; 
\n ID |  日期|  值|  VALUE2 |  VALUE3\n -|  --------- |  ----- |  ------ |  ------\n  1 |  18年5月28日|  100 |  10 |  50\n  2 |  18年5月29日|  200 |  20 |  60\n

db <> 在這里撥弄

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM