SQL为子查询

时间:2018-01-10 15:07:05

标签: sql sql-server

早上好,

我想以这样的方式改变我的查询,只选择从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,除了最新的一个。

1 个答案:

答案 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
                 );

与非工作查询相比,样本数据和所需结果更容易使用。