Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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
使用ORACLE SQL查询不同行中的数据_Sql_Oracle_Oracle11g_Analytics_Oracle12c - Fatal编程技术网

使用ORACLE SQL查询不同行中的数据

使用ORACLE SQL查询不同行中的数据,sql,oracle,oracle11g,analytics,oracle12c,Sql,Oracle,Oracle11g,Analytics,Oracle12c,我有这张桌子: +------+-------+---------+----------------------------+ | id | date | value | value2 | value3 | +------+-------+---------+----------------------------+ | 1 | 5/28 | 100 | NULL | NULL | | 1 | 5/27 | 2

我有这张桌子:

+------+-------+---------+----------------------------+
| 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  | ...     | ....    | ...              |
+------+-------+--------------------------------------+
我需要查询每列的最新可能值。因此,如果value2在value3不为空的一天为空,它将获得value2不为空的前一条记录。我不确定这是否有意义,但这是我想要的结果表:

+------+-------+-------+--------+----------+
| 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>
这里有一个选择:

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>

最后一个_值窗口函数也可用于此

例如:


DBFIDLE

最后一个值窗口函数也可用于此操作

例如:


dbfiddle

谢谢,只是一个后续问题。如果我将此应用于一个更大的表,其中包含更多的日期和列的空值差异,那么我必须手动检查每个日期,并为“test”创建数据集?这是否意味着,每当在表中提交的新日期中每列有新值时,我都必须编辑我的查询?不。CTE公共表表达式或我使用的WITH factoring子句在这里只是为了快速提供示例数据集;否则,我必须实际创建表并插入到这些行中。在您的例子中,您将使用从7开始的行,用实际的表名替换test。您不必手动执行任何操作。试一试。谢谢,只是一个跟进问题。如果我将此应用于一个更大的表,其中包含更多的日期和列的空值差异,那么我必须手动检查每个日期,并为“test”创建数据集?这是否意味着,每当在表中提交的新日期中每列有新值时,我都必须编辑我的查询?不。CTE公共表表达式或我使用的WITH factoring子句在这里只是为了快速提供示例数据集;否则,我必须实际创建表并插入到这些行中。在您的例子中,您将使用从7开始的行,用实际的表名替换test。您不必手动执行任何操作。试试看。
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;
ID | date | VALUE | VALUE2 | VALUE3 -- | --------- | ----- | ------ | ------ 1 | 28-MAY-18 | 100 | 10 | 50 2 | 29-MAY-18 | 200 | 20 | 60