Sql 如何查询和显示具有相同id、相同日期和相同名字的行结果的最长名称

Sql 如何查询和显示具有相同id、相同日期和相同名字的行结果的最长名称,sql,Sql,对于每个相同的id、相同的日期和相同的名字,我希望通过group by或任何其他解决方法显示最短的姓氏: 这是桌子: 以下是我希望看到的结果: 我想知道是否有人可以告诉我如何通过查询来实现这一点 谢谢有几种方法可以做到这一点,这里有两种。由于您没有标记sql以外的任何内容,因此我不确定您使用的是哪个程序或所需的语法。我使用SQLServer2008R2,这就是您看到的代码。如果您使用mysql、oracle、其他sql server版本或其他版本,请标记它 以下是基本数据: SELECT 1

对于每个相同的id、相同的日期和相同的名字,我希望通过group by或任何其他解决方法显示最短的姓氏:

这是桌子:

以下是我希望看到的结果:

我想知道是否有人可以告诉我如何通过查询来实现这一点


谢谢

有几种方法可以做到这一点,这里有两种。由于您没有标记sql以外的任何内容,因此我不确定您使用的是哪个程序或所需的语法。我使用SQLServer2008R2,这就是您看到的代码。如果您使用mysql、oracle、其他sql server版本或其他版本,请标记它

以下是基本数据:

SELECT 1 as ID, '2019-01-01' as [Date], 'Edward Brady' as LastName, 'Tom' as FirstName
into #table
UNION
SELECT 1 as ID, '2019-01-01' as [Date], 'Brady' as LastName, 'Tom' as FirstName
UNION
SELECT 2 as ID, '2019-02-02' as [Date], 'Wardell Curry' as LastName, 'Steph' as FirstName
UNION
SELECT 2 as ID, '2019-02-02' as [Date], 'Curry' as LastName, 'Steph' as FirstName
UNION
SELECT 2 as ID, '2019-02-02' as [Date], 'Curry II' as LastName, 'Steph' as FirstName
UNION
SELECT 3 as ID, '2019-03-03' as [Date], 'Ronaldo' as LastName, 'Christiano' as FirstName
UNION
SELECT 3 as ID, '2019-03-03' as [Date], 'Ronaldo' as LastName, 'Christiano' as FirstName
您可以使用公共表表达式(CTE)并根据字符串的实际长度重新连接它

WITH CTE AS
    (SELECT Distinct ID
                    ,Date
                    ,Firstname
                    ,Min(len(LastName)) as Shortest
     FROM #table
     GROUP BY ID
             ,Date
             ,FirstName)
SELECT   t.ID
        ,t.Date
        ,t.lastname
        ,t.firstname
FROM #table t
JOIN CTE c ON c.ID = t.ID
           AND LEN(Lastname) = Shortest
这是一个类似的想法,但没有使用连接和行数

WITH CTE AS
    (SELECT Distinct ID
                    ,Date
                    ,Firstname
                    ,LastName
                    ,ROW_NUMBER() over (Partition By ID ORDER BY LEN(LastName) ASC) as Rnk
     FROM #table)
SELECT * 
FROM CTE
WHERE Rnk = 1

如果希望每个
id
的所有姓氏最短:

select t.*
from t
where len(t.lastname) = (select min(len(t2.lastname))
                         from t t2
                         where t2.id = t.id
                        );
实际上,在这种情况下,选择其中一个,
row\u number()
是一个很好的解决方案:

select t.*
from (select t.*, row_number() over (partition by id order by len(lastname) asc) as seqnum
      from t
     ) t
where seqnum = 1;

您可能需要一分钟来重新格式化您的问题。。。。另外,请查看,它很好地概述了不使用图像的许多原因。感谢您的回复。我也浏览了你的链接。我认为这些链接中的图像可能更有助于直观地解释事情。我会通过您正在使用的任何程序(如PHP)来实现这一点,但下面是如何获取字符串的长度:SELECT LEN('W3Schools.com');