Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 从同一个表更新表_Sql Server_Common Table Expression - Fatal编程技术网

Sql server 从同一个表更新表

Sql server 从同一个表更新表,sql-server,common-table-expression,Sql Server,Common Table Expression,我有一个数据集,我想在其中更新列PREVACCEPTID 更新基于同一表格的内容,示例数据如下所示: 搜索后,应更新该列,以查看电台是否有以前的接收,这是什么 如果我们为站点A选择所有不同的“ACCEPTID”,我们将得到以下结果 我想使用这个独特的ACCEPTID来填充“PREVACCEPTID” 因此,无论何时我有一个例如“142692”的条目,我都会查找子表并检查是否存在任何以前的ACCEPTID,如果是这种情况,请使用以前的ACCEPTID进行填充,在这种情况下,请参见填充后的结果表“1

我有一个数据集,我想在其中更新列PREVACCEPTID

更新基于同一表格的内容,示例数据如下所示:

搜索后,应更新该列,以查看电台是否有以前的接收,这是什么

如果我们为站点A选择所有不同的“ACCEPTID”,我们将得到以下结果

我想使用这个独特的ACCEPTID来填充“PREVACCEPTID”

因此,无论何时我有一个例如“142692”的条目,我都会查找子表并检查是否存在任何以前的ACCEPTID,如果是这种情况,请使用以前的ACCEPTID进行填充,在这种情况下,请参见填充后的结果表“142691”

我现在尝试了一些方法,但我发现以下错误:

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