如何解决从上一行中拉出非空白
我有以下数据(前3列)。我想创建第四列-1597437386198
08/14/2020/ 20:36:26
。
newstatus
列的逻辑是
- 每个pk2
- 如果列
newstatus
为空,则从status
是新的还是旧的最新行。
因为第3行从第2行获得新值,而第9行从第7行获得旧值,所以第8行被忽略,因为它具有值status
ignore
解决方法
嗯。 。 。使用outer apply
select t.*,(case when status is null then t2.status end) as new_status
from t outer apply
(select top (1) t2.*
from t t2
where t2.pk2 = t.pk2 and t2.status in ('old','new') and
t2.pk1 < t.pk1
order by t2.pk1 desc
) t2;
实际上有一种无需子查询即可完成此操作的方法。 。 。这可能是最有效的方法:
select t.*,(case when status is null and
max(case when status = 'old' then pk1 end) over (partition by pk2 order by pk1) >
max(case when status = 'new' then pk2 else 0 end order by pk1) over (partition by pk2)
then 'old'
when status is null and
max(case when status = 'new' then pk1 end) over (partition by pk2 order by pk1) >
max(case when status = 'old' then pk2 else 0 end) over (partition by pk2 order by pk1)
then 'new'
end) as new_status
from t;
,
您可以使用窗口功能。
这个想法是建立每当具有“新”或“旧”状态时其累积计数就增加的行组。然后,您可以在需要时使用first_value()
访问相应的状态。
select
t.*,case when status is null and grp > 0
then first_value(status) over(partition by pk2,grp order by pk1)
else status
end as new_status
from (
select
t.*,sum(case when status in ('old','new') then 1 else 0 end)
over(partition by pk2 order by pk1) grp
from mytable t
) t
,
您可以使用此脚本
WITH OuterT AS
(
SELECT *,ROW_NUMBER() OVER(PARTITION BY pk2 ORDER BY pk1) num FROM tbl
)
SELECT pk1,[Status],pk2,(CASE WHEN num=1 or [Status] !='' THEN ''
WHEN num !=1 THEN
(SELECT TOP 1 innerT.[Status] FROM OuterT innerT WHERE innerT.pk2 =OuterT.pk2 and ([status] ='new' or [status] ='old') and num != 1 and innerT.pk1 < OuterT.pk1 ORDER BY pk1 DESC)
END) newstatus
FROM OuterT
工作原理:
我用common_table_expression
命名为OuterT
WITH OuterT AS
(
SELECT *,ROW_NUMBER() OVER(PARTITION BY pk2 ORDER BY pk1) num FROM tbl
)
然后我用ROW_NUMBER
命名为num
OuterT
的内部结果是:
然后,我使用了CASE
,其中包含基于OuterT
的逻辑
(CASE WHEN num=1 or [Status] !='' THEN ''
WHEN num !=1 THEN
(SELECT TOP 1 innerT.[Status] FROM OuterT innerT WHERE innerT.pk2 =OuterT.pk2 and ([status] ='new' or [status] ='old') and num != 1 and innerT.pk1 < OuterT.pk1 ORDER BY pk1 DESC)
END) newstatus
最终结果是:
注意:如果要使用脚本,只需将“ tbl”替换为表名
,这是一所古老的学校,没有开窗功能,也没有外部应用。
drop table if exists #testTable;
go
create table #testTable(
pk int unique not null,[status] varchar(20),pk2 int not null);
insert into #testTable(pk,[status],pk2) values
(1,null,1),(2,'new',(3,(4,'ignore',(5,(6,2),(7,'old',(8,(9,(10,2);
以下是一些示例数据:
class GetRequest extends React.Component {
constructor(props) {
super(props);
this.state = {
gemBTCask: null,gemBTCbid: null,gemETHask: null,gemETHbid: null
};
}
async componentDidMount() {
fetch('https://api.gemini.com/v1/pubticker/ethusd')
.then(response => response.json())
.then(data => this.setState({ gemETHask: data.ask }))
//.then(data => this.setState({ gemETHbid: data.bid }));
fetch('https://api.gemini.com/v1/pubticker/ethusd')
.then(response => response.json())
.then(data => this.setState({ gemETHbid: data.bid }));
fetch('https://api.gemini.com/v1/pubticker/btcusd')
.then(response => response.json())
.then(data => this.setState({ gemBTCask: data.ask }));
fetch('https://api.gemini.com/v1/pubticker/btcusd')
.then(response => response.json())
.then(data => this.setState({ gemBTCask: data.ask }));
}
render() {
const { gemBTCask } = this.state;
const { gemBTCbid } = this.state;
const { gemETCask } = this.state;
const { gemETCbid } = this.state;
return (
<div className="card text-center m-3">
<div className="card-body">
gemini BTC bid: $: {gemBTCbid}
</div>
<div className="card-arm">
gemini BTC ask: $: {gemBTCask}
</div>
<div className="card-ear">
gemini ETC bid: $: {gemETCbid}
</div>
<div className="card-leg">
gemini ETC ask: $: {gemETCask}
</div>
</div>
);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。