Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.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

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 如果值在同一列中重复,如何比较?_Sql_Sql Server - Fatal编程技术网

Sql 如果值在同一列中重复,如何比较?

Sql 如果值在同一列中重复,如何比较?,sql,sql-server,Sql,Sql Server,我有两个这样的专栏: ChannelURI UserId 1020 1 1040 2 1060 3 1020 5 1090 4 1020 5 现在我想检查前面的任何行条目是否具有最后一行的最后一个值,如果是,并且它具有相同的userID,则跳过,如果发现匹配并且具有不同的userID,则在ChannelUri中插入null 在这种情况下,用户ID=1的cha

我有两个这样的专栏:

ChannelURI    UserId
1020            1
1040            2
1060            3
1020            5
1090            4
1020            5
现在我想检查前面的任何行条目是否具有最后一行的最后一个值,如果是,并且它具有相同的userID,则跳过,如果发现匹配并且具有不同的userID,则在ChannelUri中插入null

在这种情况下,用户ID=1的channeluri应设置为null


知道如何实现这一点吗?

SQL将数据视为无序集。除非您通过指定顺序,否则行可以合法地以任何顺序返回

除非您还有另一个字段,可以根据这些字段对数据进行排序,否则前一条记录实际上可以是任何内容

您可以选择所有数据,然后用PHP或.Net解析,对吗?没有

仅仅因为数据通常以相同的顺序返回,它永远无法保证。数据的更改、磁盘上数据的碎片、索引、并行性和许多其他因素意味着数据可以在任何时候以不同的顺序返回

如果您的逻辑依赖于数据的顺序,则必须指定ORDERBY子句,因此,隐含地说,必须在数据中包含允许您对其进行排序的字段


很抱歉。

假设您有一个列“Sort”用于按其对行进行排序,下面的语句就可以做到这一点:

UPDATE m
SET ChannelURI = NULL
FROM mytable m
JOIN mytable m2 
  ON m.ChannelURI = m2.ChannelURI
  AND m.UserId != m2.UserId
  AND m2.Sort = (SELECT MAX(sort) FROM mytable)

基本上,这采用了与相同的思想,但使用SELECT TOP 1检索最后一行,而不是使用MAXsort进行过滤:


你说的上一个和最后一个是什么意思?这些词假设你有一个顺序。您是按哪个列排序的?当您说在ChannelUri中插入null时,您是指在查询返回的值中,还是按照其中一个答案的合理假设,从字面上更改表中的数据?+1:但是,如果您的假设是真的,我想这需要和m2.sort=从mytable或等效项中选择MAXsort。。。检查前面的任何一行条目是否具有最后一行的最后一个值[重要部分是最后一行]。尽管我不是100%确定。@如果为True,我已经更新了答案。我的版本将确保ChannelURI对每个用户都是唯一的,而不关心OP所要求的最后一行。
UPDATE m
SET ChannelURI = NULL
FROM mytable m
JOIN (
  SELECT TOP (1) ChannelURI, UserId
  FROM mytable
  ORDER BY sort DESC
) last
  ON m.ChannelURI = last.ChannelURI
  AND m.UserId   != last.UserId