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

Comparing the length of two similar strings and picking the longest

我正在尝试比较两个字符串并在它们相似时选择最长的字符串,我使用以下代码成功地选择了最长的字符串:

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' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. Msg 209, Level 16, State 1, Line 5 Ambiguous column name 'Product'. Msg 209, Level 16, State 1, Line 2 Ambiguous column name 'Product'.

我要选择的数据示例:

1 山姆
1 萨曼莎
2 奥利弗
3 奥利
4 本杰明
4 本
...
我希望输出列表是这样的:

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

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

这里要求的是进一步的测试数据:

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

想要的结果是这样的:

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

我最终弄明白了并使用了以下代码:

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

您的查询与您的示例数据和输出不相符。因此,我围绕所提供的示例数据构建了它,以演示解决此问题的一种方法。

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

---编辑---

为了证明此代码仍然returns 新示例数据的所需输出...

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

这个returns:

1   Samantha
2   Oliver
3   Ollie
4   Benjamin

既然你声称这仍然不起作用,你需要提供一个例子来说明它如何或为什么不起作用。你一直提到 LIKE 但没有解释或证明它是如何在这里发挥作用的。帮助我了解问题,我可以帮助您找到解决方案。

也许另一种选择:WITH TIES 子句与 Row_Number()

一致

例子

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