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。真的很有用@你能帮我写下代码和你建议的编辑吗?我似乎不能让他们工作,但我想有最短的文本也显示没有,如果其他人这样做。谢谢