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

时间:2019-01-24 22:59:06

标签: sql

对于每个相同的id,相同的日期和相同的名字,我想通过分组依据或任何其他变通方法来显示最短的姓氏:

这是桌子: https://imgur.com/LnJRqMZ

以下是我希望看到的结果: https://imgur.com/BSv1ibi

我想知道是否有人可以通过查询向我展示如何做到这一点。

谢谢

2 个答案:

答案 0 :(得分:0)

有几种方法可以做到这一点,这里有两种。因为除了sql之外没有标记其他任何内容,所以我不确定您使用的是哪个程序或所需的语法。我使用的是sql server 2008 r2,所以这是您看到的代码。如果您使用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

这是一个相似的想法,但无需使用Join和ROW_NUMBER即可完成。

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

答案 1 :(得分:0)

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

select t.*
from t
where len(t.lastname) = (select min(len(t2.lastname))
                         from t t2
                         where t2.id = t.id
                        );

实际上,在这种情况下,选择其中一个,row_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;