如何比较同一列中重复的值?

时间:2012-05-02 21:12:40

标签: sql sql-server

我有两个这样的列:

ChannelURI    UserId
1020            1
1040            2
1060            3
1020            5
1090            4
1020            5

现在我想检查前一行中的任何条目是否具有最后一行的最后一个值,如果是,并且它具有相同的userID,然后跳过,如果找到(匹配)并且使用不同的userId,则在ChannelUri中插入null < / p>

在这种情况下,user ID =1应将channeluri设置为null

任何想法如何实现?

3 个答案:

答案 0 :(得分:2)

SQL认为数据是无序集。除非您指定ORDER BY,否则行可以合法地以任何顺序返回。

除非您还有其他字段可以订购数据,否则“之前的记录”实际上几乎可以是任何字段。


可以只选择所有数据并用PHP或.Net解析它,对吗?的 不。

因为数据通常以相同的顺序返回,所以永远不会保证。对数据的更改,磁盘上数据的碎片,索引,并行性和许多其他因素意味着数据可以随时以不同的顺序返回。


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

对不起。

答案 1 :(得分:2)

假设您有一个用于按行排序的列'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)

答案 2 :(得分:0)

基本上,这与@erikxiv's answer使用相同的想法,但使用SELECT TOP (1)检索最后一行,而不是在MAX(sort)上过滤:

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