Sql server 从同一个表更新表
我有一个数据集,我想在其中更新列PREVACCEPTID 更新基于同一表格的内容,示例数据如下所示: 搜索后,应更新该列,以查看电台是否有以前的接收,这是什么 如果我们为站点A选择所有不同的“ACCEPTID”,我们将得到以下结果 我想使用这个独特的ACCEPTID来填充“PREVACCEPTID” 因此,无论何时我有一个例如“142692”的条目,我都会查找子表并检查是否存在任何以前的ACCEPTID,如果是这种情况,请使用以前的ACCEPTID进行填充,在这种情况下,请参见填充后的结果表“142691” 我现在尝试了一些方法,但我发现以下错误:Sql server 从同一个表更新表,sql-server,common-table-expression,Sql Server,Common Table Expression,我有一个数据集,我想在其中更新列PREVACCEPTID 更新基于同一表格的内容,示例数据如下所示: 搜索后,应更新该列,以查看电台是否有以前的接收,这是什么 如果我们为站点A选择所有不同的“ACCEPTID”,我们将得到以下结果 我想使用这个独特的ACCEPTID来填充“PREVACCEPTID” 因此,无论何时我有一个例如“142692”的条目,我都会查找子表并检查是否存在任何以前的ACCEPTID,如果是这种情况,请使用以前的ACCEPTID进行填充,在这种情况下,请参见填充后的结果表“1
UPDATE a
SET a.PREVACCEPTID = (CASE
WHEN COUNT(DISTINCT b.ACCEPTID) = 1
THEN b.ACCEPTID
WHEN COUNT(DISTINCT b.ACCEPTID) > 1
AND b.ACCEPTID <> MIN(a.ACCEPTID)
THEN b.ACCEPTID - 1
END)
FROM dbo.table a
RIGHT JOIN dbo.table b ON b.STATION = a.STATION
AND b.PERIOD = a.PERIOD
AND b.ACCEPTID = a.ACCEPTID
我得到这个错误:
消息157,第15级,状态1,第326行
聚合不能出现在UPDATE语句的集合列表中
最终结果如下所示:
我认为cte是更好的选择,但我从未使用过
提前感谢。如果我正确解释了您的问题和随后的评论,我假设您希望将前一个AcceptID填充为共享同一电台和时段的给定行集合的最后一个AcceptID。最后一个假设是由时间组件StackDate和QTime定义的。而且,如果给定的电台和时段只有一行,您希望将前一个AcceptID设置为与该行的AcceptID相同 在上述条件下,下面是一个有效的查询。注意:将表“Test”替换为您自己的表名
这看起来很像SQL Server…那你为什么用MySQL标记呢?另外,向我们展示更新后的最终输出也会很有帮助。@TimBiegeleisen你是对的,这是SQL Server,我一直在绞尽脑汁想弄清楚这一点。尝试了一些东西,然后匆忙发布了这个。似乎接受ID是以增量生成的,因此之前的接受ID将是-1。但我希望利用时间来识别使用时间戳的accept ID。规则对我来说并不清楚。@Papazzo哪个部分?我想用“ACCEPTID”填充“PREVACCEPTID”。如果该特定电台以前没有接受ID,“PREVACCEPTID”与“ACCEPTID”相同。一个站点可以有1到x个接受ID。在本例中,有3个142691、142692和142693,因此142692的prev accept ID为142691。我想浏览数据集并进行相应的填充。谢谢你,这正是我想要实现的目标。这里我们选择的是“最后一个”acceptid,但我希望能够选择上一个。因此,在将代码更改为“ASC”排序后,这将为整个列表提供“142691”,但我想要的是为“142693”条目检索“142692”,为“142692”条目检索“142691”,即“上一个”accepID,而不是最后一个。好的,我已经成功地做到了,使用了您答案的变体,感谢您朝着正确的方向操作。
UPDATE t SET PrevAcceptID =
ISNULL(
(SELECT TOP 1 AcceptID
FROM Test t2
WHERE t2.Station = t.Station AND t2.Period = t.Period AND t2.AcceptID < t.AcceptID ORDER BY StackDate DESC, QTime DESC),
AcceptID)
FROM Test AS t