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显式地包含第一个结果,而不是依赖它与不匹配