比较两个相似字符串的长度并选择最长的字符串

时间:2018-02-23 16:16:03

标签: sql-server sql-like

我正在尝试比较两个字符串并选择最长的字符串,如果它们相似,我设法通过使用以下代码选择最长的字符串:

SELECT D.RID, ProductID, Product, [Length] FROM (
SELECT RID, MAX([Length]) AS theLength FROM SortData GROUP BY RID)
AS X INNER JOIN SortData AS D ON D.RID = X.RID AND D.[Length] = X.theLength

但是我现在正在尝试确保代码只选择最长的字符串,如果它与它正在比较它的单词,我尝试了以下代码,但是如果有人可以,我会很感激帮助我:

SELECT D.RID, D.ProductID, Product, [Length] FROM (
SELECT RID, Product, MAX([Length]) AS theLength FROM SortData GROUP BY RID)
AS X INNER JOIN SortData AS D ON D.RID = X.RID AND D.[Length] = X.theLength WHERE
D.Product LIKE Product

使用此代码我收到以下错误:

  

Msg 8120,Level 16,State 1,Line 3 Column' SortData.Product'是   在选择列表中无效,因为它不包含在任何一个中   聚合函数或GROUP BY子句。 Msg 209,Level 16,State 1,   第5行不明确的列名称'产品'。 Msg 209,Level 16,State 1,   第2行不明确的列名称'产品'。

我想选择的数据示例:

1 Sam 1萨曼莎
2奥利弗
3 Ollie
4本杰明
4本
...
我希望输出列表如下:

1萨曼莎
2奥利弗
3 Ollie
4本杰明
...

为了澄清我在这个例子的上下文中要做的事情,我试图比较两个名字,如果是LIKE(例如x.Name LIKE Name),那么选择最长...

如此处所要求的是进一步的测试数据:

1氢 1氢氧化物
1一氧化碳
2碳
2碳
2二氧化碳
3一氧化碳
3二氧化碳
3氧气
4二氧化氢

期望的结果如下:

1氢氧化物
1一氧化碳
2二氧化碳
3一氧化碳
3氧气
4二氧化氢

3 个答案:

答案 0 :(得分:1)

您的查询并未接近您的示例数据和输出。因此,我围绕提供的示例数据构建了这个,以演示解决此问题的一种方法。

declare @Something table
(
    Col1 int
    , Col2 varchar(20)
)

insert @Something values
(1, 'Sam')
, (1, 'Samantha')
, (2, 'Oliver')
, (3, 'Ollie')

select x.Col1
    , x.Col2
from
(
    select *
        , RowNum = ROW_NUMBER() over(partition by Col1 order by LEN(Col2) desc)
    from @Something
) x
where x.RowNum = 1

<强> --- --- EDIT

要证明此代码仍然从新的示例数据中返回所需的输出...

declare @Something table
(
    Col1 int
    , Col2 varchar(20)
)

insert @Something values
(1, 'Sam')
, (1, 'Samantha')
, (2, 'Oliver')
, (3, 'Ollie')
, (4, 'Benjamin')
, (4, 'Ben')

select x.Col1
    , x.Col2
from
(
    select *
        , RowNum = ROW_NUMBER() over(partition by Col1 order by LEN(Col2) desc)
    from @Something
) x
where x.RowNum = 1

返回:

1   Samantha
2   Oliver
3   Ollie
4   Benjamin

既然你声称这仍然无法奏效,你需要提供一个如何或为何不起作用的例子。你一直提到LIKE,但没有解释或演示这是如何发挥作用的。帮助我理解问题,我可以帮助您找到解决方案。

答案 1 :(得分:1)

也许是另一种选择:与WITH TIES

一致的Row_Number()条款

示例

Select Top 1 with ties * 
 From  YourTable
 Order By Row_Number() over (Partition by ID Order By Len(Name) desc)

答案 2 :(得分:0)

我总结出来并使用以下代码:

SELECT D.RID, ProductID, D.Product, [Length] FROM 
(
SELECT RID, MAX([Length]) AS theLength 
FROM SortData GROUP BY RID
) AS X 
INNER JOIN SortData AS D ON D.RID = X.RID AND D.[Length] = X.theLength
WHERE D.Product LIKE Product
GO