如果另一列中的值是唯一的,那么如何在SQL中放置一个显示1的列,如果它是重复的则为0?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果另一列中的值是唯一的,那么如何在SQL中放置一个显示1的列,如果它是重复的则为0?相关的知识,希望对你有一定的参考价值。
您可以使用窗口函数和CTE为“data”的每个分区分配行号,然后在行号为1时将标志设置为1,否则为0。
这假定:
- 要评估的字段称为“数据”
- 在所有其他条目中,第一个条目不被视为重复条目。第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;
?
是createdAt
或id
等列的占位符,它指定表中值的排序。
如果您没有指定排序的列,则可以使用触发器检查该值是否已存在。但是,我建议使用identity()
列或createdAt
列(或两者)创建表来捕获插入顺序,而不是编写触发器。
以上是关于如果另一列中的值是唯一的,那么如何在SQL中放置一个显示1的列,如果它是重复的则为0?的主要内容,如果未能解决你的问题,请参考以下文章
在python中,我如何对一列中每个值与另一列中的值发生的次数(多少行)建立矩阵?