Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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
Sql 选择数据发生变化的结果行_Sql_Oracle_Oracle11g - Fatal编程技术网

Sql 选择数据发生变化的结果行

Sql 选择数据发生变化的结果行,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,样本数据 Name StartDate Event Ali 1/7/2010 garage Ali 1/8/2010 garage Ali 1/9/2010 garage Ali 1/10/2010 aircond Ali 1/11/2010 aircond Ali 1/12/2010 aircond Ali 1/13/2010 aircond Ali 1/14/2010 garage Ali 1/15/2010 yard Ali 1/16/2010

样本数据

Name StartDate  Event
Ali 1/7/2010    garage
Ali 1/8/2010    garage
Ali 1/9/2010    garage
Ali 1/10/2010   aircond
Ali 1/11/2010   aircond
Ali 1/12/2010   aircond
Ali 1/13/2010   aircond
Ali 1/14/2010   garage
Ali 1/15/2010   yard
Ali 1/16/2010   dock
Ali 1/17/2010   dock
期望

Name    Start Date  Event
Ali 1/7/2010    garage
Ali 1/10/2010   aircond
Ali 1/14/2010   garage
Ali 1/15/2010   yard
Ali 1/16/2010   dock
各位专家:


我有个问题。我需要设计一个查询,使其仅在事件列发生更改(如我在预期表中所做的更改)时才会拾取。您能告诉我如何在sql oracle中执行此操作吗?

这是一个“间隙和孤岛”问题

您可以使用子查询和
lag
分析函数来回溯以前的值-在
partitionby
order by
子句中定义“previous”的含义-然后根据该值进行过滤:

select name, startdate, event
from (
  select name, startdate,
    case when lag_event is null or lag_event != event then event end as event
  from (
    select name, startdate, event,
      lag(event) over (partition by name order by startdate) as lag_event
    from t42
  )
)
where event is not null
order by name, startdate, event;

NAME       STARTDATE EVENT    
---------- --------- ----------
Ali        07-JAN-10 garage     
Ali        10-JAN-10 aircond    
Ali        14-JAN-10 garage     
Ali        15-JAN-10 yard       
Ali        16-JAN-10 dock       
);或者你可以看到发生了什么。最里面的查询添加了“lag”列;下一层将当前值与滞后值进行比较,并仅在其发生变化时保留该值;外部查询排除了在该过程之后为null的查询,也就是说,它排除了那些没有更改的查询

解决这类问题的另一种方法是将每次连续运行的值分配给一个bucket,然后找到每个bucket的第一个日期。您可以使用
行数
分析函数指定具有技巧的桶:

select name, startdate, event,
  row_number() over (partition by name, event order by startdate)
    - row_number() over (partition by name order by startdate) as chain
from t42
order by name, startdate, event;
然后将其用作子查询,使用聚合只获取您感兴趣的第一个日期:

select name, min(startdate) as startdate, event
from (
  select name, startdate, event,
    row_number() over (partition by name, event order by startdate)
      - row_number() over (partition by name order by startdate) as chain
  from t42
)
group by name, event, chain
order by name, startdate, event;

NAME       STARTDATE EVENT    
---------- --------- ----------
Ali        07-JAN-10 garage     
Ali        10-JAN-10 aircond    
Ali        14-JAN-10 garage     
Ali        15-JAN-10 yard       
Ali        16-JAN-10 dock       

这是一个“缺口和孤岛”问题

您可以使用子查询和
lag
分析函数来回溯以前的值-在
partitionby
order by
子句中定义“previous”的含义-然后根据该值进行过滤:

select name, startdate, event
from (
  select name, startdate,
    case when lag_event is null or lag_event != event then event end as event
  from (
    select name, startdate, event,
      lag(event) over (partition by name order by startdate) as lag_event
    from t42
  )
)
where event is not null
order by name, startdate, event;

NAME       STARTDATE EVENT    
---------- --------- ----------
Ali        07-JAN-10 garage     
Ali        10-JAN-10 aircond    
Ali        14-JAN-10 garage     
Ali        15-JAN-10 yard       
Ali        16-JAN-10 dock       
);或者你可以看到发生了什么。最里面的查询添加了“lag”列;下一层将当前值与滞后值进行比较,并仅在其发生变化时保留该值;外部查询排除了在该过程之后为null的查询,也就是说,它排除了那些没有更改的查询

解决这类问题的另一种方法是将每次连续运行的值分配给一个bucket,然后找到每个bucket的第一个日期。您可以使用
行数
分析函数指定具有技巧的桶:

select name, startdate, event,
  row_number() over (partition by name, event order by startdate)
    - row_number() over (partition by name order by startdate) as chain
from t42
order by name, startdate, event;
然后将其用作子查询,使用聚合只获取您感兴趣的第一个日期:

select name, min(startdate) as startdate, event
from (
  select name, startdate, event,
    row_number() over (partition by name, event order by startdate)
      - row_number() over (partition by name order by startdate) as chain
  from t42
)
group by name, event, chain
order by name, startdate, event;

NAME       STARTDATE EVENT    
---------- --------- ----------
Ali        07-JAN-10 garage     
Ali        10-JAN-10 aircond    
Ali        14-JAN-10 garage     
Ali        15-JAN-10 yard       
Ali        16-JAN-10 dock       

这是一个“缺口和孤岛”问题

您可以使用子查询和
lag
分析函数来回溯以前的值-在
partitionby
order by
子句中定义“previous”的含义-然后根据该值进行过滤:

select name, startdate, event
from (
  select name, startdate,
    case when lag_event is null or lag_event != event then event end as event
  from (
    select name, startdate, event,
      lag(event) over (partition by name order by startdate) as lag_event
    from t42
  )
)
where event is not null
order by name, startdate, event;

NAME       STARTDATE EVENT    
---------- --------- ----------
Ali        07-JAN-10 garage     
Ali        10-JAN-10 aircond    
Ali        14-JAN-10 garage     
Ali        15-JAN-10 yard       
Ali        16-JAN-10 dock       
);或者你可以看到发生了什么。最里面的查询添加了“lag”列;下一层将当前值与滞后值进行比较,并仅在其发生变化时保留该值;外部查询排除了在该过程之后为null的查询,也就是说,它排除了那些没有更改的查询

解决这类问题的另一种方法是将每次连续运行的值分配给一个bucket,然后找到每个bucket的第一个日期。您可以使用
行数
分析函数指定具有技巧的桶:

select name, startdate, event,
  row_number() over (partition by name, event order by startdate)
    - row_number() over (partition by name order by startdate) as chain
from t42
order by name, startdate, event;
然后将其用作子查询,使用聚合只获取您感兴趣的第一个日期:

select name, min(startdate) as startdate, event
from (
  select name, startdate, event,
    row_number() over (partition by name, event order by startdate)
      - row_number() over (partition by name order by startdate) as chain
  from t42
)
group by name, event, chain
order by name, startdate, event;

NAME       STARTDATE EVENT    
---------- --------- ----------
Ali        07-JAN-10 garage     
Ali        10-JAN-10 aircond    
Ali        14-JAN-10 garage     
Ali        15-JAN-10 yard       
Ali        16-JAN-10 dock       

这是一个“缺口和孤岛”问题

您可以使用子查询和
lag
分析函数来回溯以前的值-在
partitionby
order by
子句中定义“previous”的含义-然后根据该值进行过滤:

select name, startdate, event
from (
  select name, startdate,
    case when lag_event is null or lag_event != event then event end as event
  from (
    select name, startdate, event,
      lag(event) over (partition by name order by startdate) as lag_event
    from t42
  )
)
where event is not null
order by name, startdate, event;

NAME       STARTDATE EVENT    
---------- --------- ----------
Ali        07-JAN-10 garage     
Ali        10-JAN-10 aircond    
Ali        14-JAN-10 garage     
Ali        15-JAN-10 yard       
Ali        16-JAN-10 dock       
);或者你可以看到发生了什么。最里面的查询添加了“lag”列;下一层将当前值与滞后值进行比较,并仅在其发生变化时保留该值;外部查询排除了在该过程之后为null的查询,也就是说,它排除了那些没有更改的查询

解决这类问题的另一种方法是将每次连续运行的值分配给一个bucket,然后找到每个bucket的第一个日期。您可以使用
行数
分析函数指定具有技巧的桶:

select name, startdate, event,
  row_number() over (partition by name, event order by startdate)
    - row_number() over (partition by name order by startdate) as chain
from t42
order by name, startdate, event;
然后将其用作子查询,使用聚合只获取您感兴趣的第一个日期:

select name, min(startdate) as startdate, event
from (
  select name, startdate, event,
    row_number() over (partition by name, event order by startdate)
      - row_number() over (partition by name order by startdate) as chain
  from t42
)
group by name, event, chain
order by name, startdate, event;

NAME       STARTDATE EVENT    
---------- --------- ----------
Ali        07-JAN-10 garage     
Ali        10-JAN-10 aircond    
Ali        14-JAN-10 garage     
Ali        15-JAN-10 yard       
Ali        16-JAN-10 dock       

Alex Poole滞后查询的简化变体:

select name, startdate, event
from
 (
    select name, startdate, event,
       case
          when event = 
             lag(event) over (partition by name order by startdate) 
          then 0 --same event
          else 1 --different event or no previous event 
       end as flag
    from t42
 )
where flag = 1
order by name, startdate, event;

Alex Poole滞后查询的简化变体:

select name, startdate, event
from
 (
    select name, startdate, event,
       case
          when event = 
             lag(event) over (partition by name order by startdate) 
          then 0 --same event
          else 1 --different event or no previous event 
       end as flag
    from t42
 )
where flag = 1
order by name, startdate, event;

Alex Poole滞后查询的简化变体:

select name, startdate, event
from
 (
    select name, startdate, event,
       case
          when event = 
             lag(event) over (partition by name order by startdate) 
          then 0 --same event
          else 1 --different event or no previous event 
       end as flag
    from t42
 )
where flag = 1
order by name, startdate, event;

Alex Poole滞后查询的简化变体:

select name, startdate, event
from
 (
    select name, startdate, event,
       case
          when event = 
             lag(event) over (partition by name order by startdate) 
          then 0 --same event
          else 1 --different event or no previous event 
       end as flag
    from t42
 )
where flag = 1
order by name, startdate, event;

您可以在事件发生时使用“中断跳过1”,它会在事件发生变化时调用“中断打开”,但仅为该事件的变化选择最上面一行是困难的。您可以在事件发生时使用“中断跳过1”,它会在事件发生变化时调用“中断打开”,但仅为该事件的变化选择最上面一行是困难的。您可以在事件发生时使用“中断跳过1”,它会在事件发生时调用“中断打开”更改但仅为该事件更改选择顶行是困难的您可以使用事件中断跳过1它将在事件更改时调用中断,但仅为该事件更改选择顶行是困难的difficult@PrikshitConc. - 是的,它将在SQL*Plus中工作;为什么不呢?这只是标准的Oracle SQL语法。@PrikshitConc。-是的,它将在SQL*Plus中工作;为什么不呢?这只是标准的Oracle SQL语法。@PrikshitConc。-是的,它将在SQL*Plus中工作;为什么不呢?这只是标准的Oracle SQL语法。@PrikshitConc。-是的,它将在SQL*Plus中工作;为什么不呢?这只是标准的Oracle SQL语法。我更希望能够使用
lag\u event is null
显式地包含第一个结果,而不是依赖它与
=
不匹配,并发现额外的子查询更清楚一些;但那只是我*8-)我更喜欢能够用
滞后事件为null显式地包含第一个结果,而不是依赖它与
=
不匹配,并发现额外的子查询对此更清楚一些;但那只是我*8-)我更喜欢能够使用
lag\u event is null显式地包含第一个结果,而不是依赖它与不匹配