早上好,
我想以这样的方式改变我的查询,只选择从h.started asc过滤的前1位。
select h.started, * from wshhistory h
join asset a on h.assetid = a.uid
inner join
(
select Count(*) as TotalLatest, a.uid, a.deleted from asset a
join wshhistory h on a.uid = h.assetid
where h.latest = 1
group by a.uid, a.deleted
having Count(*) > 1
) X
on X.uid = h.assetid
where X.deleted = 0 and h.latest = 1
order by h.assetid desc
我搜遍了大多数帖子,并在大多数帖子中找到了:
ROW_NUMBER() OVER (PARTITION BY a.uid ORDER BY h.started asc) as rn
但我似乎无法使用这个,因为我需要使用group by,这会导致错误消息:
列'wshhistory.started'在选择列表中无效,因为它 不包含在聚合函数或GROUP BY中 子句。
提供一些关于我的查询的额外信息: 我需要搜索相同assetid的最新= 1(表:wshhistory)重复的地方。然后我需要将它们全部设置为0,除了最新的一个。
答案 0 :(得分:1)
我想你想要这样的东西:
with toupdate as (
select h.*,
row_number() over (partition by h.assetid order by h.started desc) as seqnum
from wshhistory h
where h.latest = 1
)
update toupdate
set latest = 0
where seqnum > 1 and
exists (select 1
from asset a
where a.uid = toupdate.assetid and a.deleted = 0
);
与非工作查询相比,样本数据和所需结果更容易使用。