我正在尝试比较两个字符串并选择最长的字符串,如果它们相似,我设法通过使用以下代码选择最长的字符串:
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二氧化氢
答案 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