Sql 确定文本是否为最短的';文本';字段包含在所有其他';文本';相同';ID';
我喜欢以下数据集:Sql 确定文本是否为最短的';文本';字段包含在所有其他';文本';相同';ID';,sql,sql-server,tsql,Sql,Sql Server,Tsql,我喜欢以下数据集: ID Text 1 The 1 The Quick 1 The Quick Brown 2 Fox 2 Fox 3 Jumps 3 Over The 3 Over The L 3 Over The Lazy 我需要有代码,告诉我最短的“文本”字段中的文本是否包含在相同“ID”的所有其他字段中 输出应如下所示: ID Text Result 1 The Y
ID Text
1 The
1 The Quick
1 The Quick Brown
2 Fox
2 Fox
3 Jumps
3 Over The
3 Over The L
3 Over The Lazy
我需要有代码,告诉我最短的“文本”字段中的文本是否包含在相同“ID”的所有其他字段中
输出应如下所示:
ID Text Result
1 The Yes
1 The Quick Yes
1 The Quick Brown Yes
2 Fox Yes
2 Fox Yes
3 Jumps No
3 Over The No
3 Over The L No
3 Over The Lazy No
实际上,一些文本字段非常长,这将占用数千行数据
谢谢你的帮助 好了,我们开始吧。
首先,标识每个值的长度,并标识每个长度最短的ID的值(或者简单地用qualify语句标识)
然后,您必须基本上将其连接到原始表,并查看该值是否包含在每个ID的不同行中
select ID, text, shortest_text, case when text like '%'+shortest_text+'%' then 1 else 0 end as contains_shortest_text
from table a
left join ([previous query, if you use Teradata I recommend the first option]) b
on a.ID=b.ID
最后,您将确定每个ID的所有行是否包含该值
select ID, text, min(contains_shortest_text) over(partition by ID) as all_contain_shortest_text
from ([previous query]) x
好的,我们开始吧。
首先,标识每个值的长度,并标识每个长度最短的ID的值(或者简单地用qualify语句标识)
然后,您必须基本上将其连接到原始表,并查看该值是否包含在每个ID的不同行中
select ID, text, shortest_text, case when text like '%'+shortest_text+'%' then 1 else 0 end as contains_shortest_text
from table a
left join ([previous query, if you use Teradata I recommend the first option]) b
on a.ID=b.ID
最后,您将确定每个ID的所有行是否包含该值
select ID, text, min(contains_shortest_text) over(partition by ID) as all_contain_shortest_text
from ([previous query]) x
试试这个:
;with shortestPerID as (
select A.ID as ID, A.Text as Text from
(select ID, Text, MAX(Len(Text)) as Length from TABLE_NAME group by ID, Text) as A
right join
(select ID, min(len(Text)) as Length from TABLE_NAME group by ID) as B
on (A.ID = B.ID and A.Length = B.Length)
)
select A.ID, A.Text,
case when B.Text is null then 'No' else 'Yes' end as Result
from TABLE_NAME as A left join shortestPerID as B
ON (A.ID = B.ID and charindex(B.Text, A.Text) > 0)
首先,CTE
是使用每个ID的文本最短的表。然后简单连接就可以做到这一点:)
试试这个
这就是结果,它是不同的:对于ID=3和Text='Jumps',它说是的,因为'Jumps'包含在它自身中:)
编辑
根据@JohnRC的建议,对于最短的文本
,您可以在选择
语句中使用其他加入
条件:
on (A.ID = B.ID and A.Length = B.Length and B.Text <> A.Text)
on(A.ID=B.ID和A.Length=B.Length和B.Text A.Text)
试试这个:
;with shortestPerID as (
select A.ID as ID, A.Text as Text from
(select ID, Text, MAX(Len(Text)) as Length from TABLE_NAME group by ID, Text) as A
right join
(select ID, min(len(Text)) as Length from TABLE_NAME group by ID) as B
on (A.ID = B.ID and A.Length = B.Length)
)
select A.ID, A.Text,
case when B.Text is null then 'No' else 'Yes' end as Result
from TABLE_NAME as A left join shortestPerID as B
ON (A.ID = B.ID and charindex(B.Text, A.Text) > 0)
首先,CTE
是使用每个ID的文本最短的表。然后简单连接就可以做到这一点:)
试试这个
这就是结果,它是不同的:对于ID=3和Text='Jumps',它说是的,因为'Jumps'包含在它自身中:)
编辑
根据@JohnRC的建议,对于最短的文本
,您可以在选择
语句中使用其他加入
条件:
on (A.ID = B.ID and A.Length = B.Length and B.Text <> A.Text)
on(A.ID=B.ID和A.Length=B.Length和B.Text A.Text)
以下是我的建议,使用临时表(SQL Server 2014):
使用与问题中相同的输入生成此结果
ID Text Result
----------- -------------------------------------------------- ------
1 The Yes
1 The Quick Yes
1 The Quick Brown Yes
2 Fox Yes
2 Fox Yes
3 Jumps No
3 Over The No
3 Over The L No
3 Over The Lazy No
以下是我的建议,使用临时表(SQL Server 2014): 使用与问题中相同的输入生成此结果
ID Text Result
----------- -------------------------------------------------- ------
1 The Yes
1 The Quick Yes
1 The Quick Brown Yes
2 Fox Yes
2 Fox Yes
3 Jumps No
3 Over The No
3 Over The L No
3 Over The Lazy No
快捷键
不是最短的,为什么要使用是的
?与快速棕色相同当您有一条最短的领带(如ID 2),但两个值不相同时,您将怎么办?理想情况下,在这种情况下,结果也会显示“否”。在这种情况下,选择哪一个并不重要,只要它们彼此不包含。@lad2025我需要ID中的所有字段都显示“是”或“否”。因为快捷键包含的是“是”而不是“包含的是”,所以为什么答案是“否”快捷键不是最短的,所以为什么要使用它Yes
?与快速棕色相同
当您有一条最短的领带(如ID 2),但两个值不相同时,您将怎么办?理想情况下,在这种情况下,结果也会显示“否”。在这种情况下,选择哪一个并不重要,只要它们彼此不包含。@lad2025我需要ID中的所有字段都显示“是”或“否”。因为Quick包含的是“是”而不是“代码”,所以为什么答案是“否”呢?如果你不想让最短文本的情况与自身进行对比测试,你可以在最后的ON中添加。和B.text A.text
。。条款然后ID=3 Text='Jumps'会显示“No”。但是ID=1和Text='Yes':)以及ID=2和Text='Fox'会有所不同,所以我会坚持我的解决方案:)但是谢谢你的建议。哦,是的,然后在CTE中你可以在选择中添加计数(ID)
。。。分组…
并在最后一部分测试计数1。谢谢。以及使用SQL FIDLE。真的很有用@你能帮我写下代码和你建议的编辑吗?我似乎不能让他们工作,但我想有最短的文本也显示没有,如果其他人这样做。谢谢如果您不想让最短文本的情况与自身进行对比测试,您可以在最后一页中添加。和B.text A.text
。。条款然后ID=3 Text='Jumps'会显示“No”。但是ID=1和Text='Yes':)以及ID=2和Text='Fox'会有所不同,所以我会坚持我的解决方案:)但是谢谢你的建议。哦,是的,然后在CTE中你可以在选择中添加计数(ID)
。。。分组…
并在最后一部分测试计数1。谢谢。以及使用SQL FIDLE。真的很有用@你能帮我写下代码和你建议的编辑吗?我似乎不能让他们工作,但我想有最短的文本也显示没有,如果其他人这样做。谢谢