如果另一列中的值是唯一的,那么如何在SQL中放置一个显示1的列,如果它是重复的则为0?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果另一列中的值是唯一的,那么如何在SQL中放置一个显示1的列,如果它是重复的则为0?相关的知识,希望对你有一定的参考价值。

我想构建一个列,如果它是一行中第一次出现的值,则将值设为1,如果不是第一次出现,则为0。

enter image description here

答案

您可以使用窗口函数和CTE为“data”的每个分区分配行号,然后在行号为1时将标志设置为1,否则为0。

Rextester Demo

这假定:

  • 要评估的字段称为“数据”
  • 在所有其他条目中,第一个条目不被视为重复条目。第1个是棘手的,因为我们没有定义订单,所以系统遇到的第一个条目将被视为非重复;除非我们在窗口函数中进一步定义顺序;非重复可能会在运行之间发生变化。

.

With CTE AS (SELECT Data, Row_Number() over (partition by Data order by Data) RN 
             FROM TableName T)
SELECT Data, case when RN = 1 then 1 else 0 end as Flg
FROM CTE

根据我使用的示例数据,返回类似的内容:

    Data    Flg
1   A   1
2   A   0
3   B   1
4   B   0
5   B   0
6   C   1
7   C   0
另一答案

首先,不可能在表中自动设置和更新此值。每次修改表后都必须重新计算它们,并且计算列不能引用其他行,或执行完整查询。

您可以使用像LAG这样的窗口函数来检查根据您提供的搜索顺序是否存在集合中的先前值,例如:

declare @t table (data varchar(10))
insert into @t
values ('A'),
    ('B'),
    ('A'),
    ('B'),
    ('B'),
    ('C'),
    ('C')


SELECT 
    Data, 
    iif( lag(1) over (partition by Data order by Data) is null,1,0) as Value
FROM @t

这将返回:

Data    Value
A       1
A       0
B       1
B       0
B       0
C       1
C       0

lag(1) over (partition by Data order by Data)按行数据列中的值对行进行分区,并按相同的值对它们进行排序,从而产生随机顺序。然后它返回该分区的“previous”值。对于第一行,没有,LAG返回null

iif( ... is null,1,0) as Value检查结果,如果为空,则返回1,否则返回0。

如果要将更改存储到表中,可以使用可更新的CTE:

declare @t table (data varchar(10),value bit)
insert into @t(data)
values ('A'),
    ('B'),
    ('A'),
    ('B'),
    ('B'),
    ('C'),
    ('C');


with x as ( SELECT 
    Data,value, 
    iif( lag(1) over (partition by Data order by Data) is null,1,0) as Val
FROM @t)
update x
set value=val
from @t;

select * 
from @t
order by data

您可以在INSERT,UPDATE,DELETE上使用触发器在每次修改时运行该查询并更新表。尽管做最后修改并执行UPDATE会更好

另一答案

SQL表表示无序集。创建表后,您的表没有足够的信息来回答此问题。

如果你有这样的表,你可以使用这样的查询来分配值:

select value,
       (case when row_number() over (partition by value order by ?) = 1
             then 1 else 0
        end) as flag
from t;

?createdAtid等列的占位符,它指定表中值的排序。

如果您没有指定排序的列,则可以使用触发器检查该值是否已存在。但是,我建议使用identity()列或createdAt列(或两者)创建表来捕获插入顺序,而不是编写触发器。

以上是关于如果另一列中的值是唯一的,那么如何在SQL中放置一个显示1的列,如果它是重复的则为0?的主要内容,如果未能解决你的问题,请参考以下文章

在python中,我如何对一列中每个值与另一列中的值发生的次数(多少行)建立矩阵?

在 pandas 中,如何根据一列中的唯一值创建列,然后根据另一列中的值填充它?

SQL - 为给定列中的值获取另一列的值

根据另一列中的值从一列中减去值(SQL)

PSQL - 查找所有值并根据另一列中的非唯一值使其唯一

检查一列中的值是不是存在于另一列中,如果存在,则将另一列中的值复制到新列中