SQL为子查询中的每个组选择前1名

SQL为子查询中的每个组选择前1名,sql,sql-server,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 wher

早上好

我想以这样一种方式修改我的查询,即只选择从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的Latest=1 table:wshhistory的副本。然后我需要将它们全部设置为0,但最新的除外。

我想您需要这样的设置:

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

示例数据和所需结果比非工作查询更容易处理。

在内部添加where rownum=1join@BasilBattikhi呵呵???OP正在尝试使用行号。不确定您的评论是什么意思,但您不能在where子句中使用窗口函数。@SeanLange LOl您是对的,似乎我得到了一个mistake@SeanLange你有什么建议?我建议OP给我们一些数据和期望的输出。这是一个很好的起点。就这样,谢谢!我会记住提供示例数据。