对于每个相同的id,相同的日期和相同的名字,我想通过分组依据或任何其他变通方法来显示最短的姓氏:
这是桌子: https://imgur.com/LnJRqMZ
以下是我希望看到的结果: https://imgur.com/BSv1ibi
我想知道是否有人可以通过查询向我展示如何做到这一点。
谢谢
答案 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;