SQL:在一列值更改时选择所有记录

时间:2017-03-31 07:37:07

标签: sql oracle

我无法找到此SQL查询的解决方案。

让我根据下表解释你:

   Group            DATUM    VALUE
    1002  2017-03-29 12:01:00     0.1
    1002  2017-03-29 12:02:36     0.2
    1002  2017-03-29 12:03:40     0.1
    1002  2017-03-29 12:04:44     0.2
    2523  2017-03-29 12:05:47     0.3
    2523  2017-03-29 12:06:51     0.1
    2523  2017-03-29 12:07:55     0.2
    2523  2017-03-29 12:08:59     0.3
    2523  2017-03-29 12:09:03     0.4
    3002  2017-03-29 12:10:07     0.5

我想获得每组的数据。因此,在上面的表格的基础上,GROUP: 1002已更改为GROUP: 2523,因此我希望收到GROUP: 1002所有记录,这是:

Group             DATUM    VALUE
1002  2017-03-29 12:01:00     0.1
1002  2017-03-29 12:02:36     0.2
1002  2017-03-29 12:03:40     0.1
1002  2017-03-29 12:04:44     0.2

并且当GROUP: 2523完成并且值更改为GROUP: 3002时,我将获得GROUP: 2523的所有记录,依此类推......

这样做的原因:

每次GROUP值更改时,原始数据都必须读入另一个程序(KNIME)(这里是SQL的一部分),然后需要为每个组计算一些特定值,新表必须写在数据库中。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您可以编写一个触发器来检查新插入是否包含除最新插入之外的其他组。在这种情况下,您必须调用一些例程将数据推送到您想要的位置。像这样:

create or replace trigger trg_latest_group_to_knime
before insert on mytable
for each row
declare
  v_last_group integer;
begin
  select max("GROUP") keep (dense_rank last order by datum)
  into v_group
  from mytable;

  if :new.group <> v_last_group then
    push_records_to_knime_for_group(v_last_group);
  end if;
end trg_latest_group_to_knime;