问题描述
我有一张下表。数据之间没有周期性,所以我无法使用row_number()或rank之类的功能。
**Column1** | **Column2** | **Timestamp**
Station1 | Data1 | Date1
Station1 | Data2 | Date2
Station1 | Data1 | Date3
Station1 | Data2 | Date4
Station1 | **Data3** | Date5
Station1 | Data2 | Date6
Station2 | Data1 | Date7
Station2 | Data2 | Date8
Station2 | **Data3** | Date9
Station2 | Data2 | Date10
column2中的普通数据类似于Data1和Data2,但是当将Data3插入column2时,它打破了Data1和Data2之间的周期性。我不想从Data3之后看到查询中的数据检索。我希望它像下面一样。
**Column1** | **Column2** | **Timestamp**
Station1 | Data1 | Date1
Station1 | Data2 | Date2
Station1 | Data1 | Date3
Station1 | Data2 | Date4
Station2 | Data1 | Date7
Station2 | Data2 | Date8
我要怎么做才能达到这个结果?预先感谢。
解决方法
您似乎仅在下一行是“ data2”时才需要“ data1”,而仅在上一行是“ data1”时才需要“ data2”。所以:
select t.*
from (select t.*,lag(column2) over (partition by column1 order by timestamp) as prev_column2,lead(column2) over (partition by column1 order by timestamp) as next_column2
from t
) t
where (column2 = 'data1' and next_column2 = 'data2') or
(column2 = 'data1' and prev_column2 = 'data1')
,
您只想显示Data1和Data2行,但只显示前一个这样的行是其他数据的行。换句话说,您要显示交替的Data1和Data2行。这可以通过select column1,column2,timestmp
from
(
select
column1,timestmp,last_value(case when column2 in ('Data1','Data2') then column2 end ignore nulls)
over
(order by timestmp rows between unbounded preceding and 1 preceding) as last_col2
from mytable
)
where column2 in ('Data1','Data2')
and decode(column2,last_col2,'same','different') = 'different'
order by timestmp;
来实现:
LAG
演示:https://dbfiddle.uk/?rdbms=oracle_18&fiddle=c8611e24eb0d54ba65e89391d11332cd
(但是,如果可以肯定,总是有Data3行加上要删除的下一行,那么可以改用column2 = '**Data3**' or lag(column2) = '**Data3**'
并丢弃const reset = () => (state) => [];
const add = (newValue) => (state) => [...state,newValue];
const overwrite = (newState) => (state) => newState;
const reset$ = new Subject();
const add$ = new Subject();
const data$ = this._data.asObservable()
...
const data = merge(
reset$.pipe(map(reset)),add$.pipe(map(add)),data$.pipe(map(overwrite))
).pipe(
scan((state,fn) => fn(state),[])
);
处的所有行。)>
简化格式:
SELECT X.column1,x.column2,x.timestamp FROM
(
SELECT A.*,LEAD(COLUMN2) OVER(ORDER BY COLUMN1,column2) NEXT_VALUE
FROM TABLE1 A
) X WHERE 'Data3' not IN (COLUMN2,NEXT_VALUE)
ORDER BY 1,2;