我有一个简单的问题,虽然我相信它的简单,但我无法弄清楚。
考虑我的下表与下面给出的数据完全相同:
CREATE TABLE #temp ( link varchar(255), number INT, fname varchar(255) ) insert into #temp VALUES ('abc',1,'f1') insert into #temp VALUES ('abc',2,'f2') insert into #temp VALUES ('abc',3,'f3') insert into #temp VALUES ('abc',4,'f6') insert into #temp VALUES ('abc',10,'f100') insert into #temp VALUES ('abe',-1,'f0') insert into #temp VALUES ('abe',1,'f1') insert into #temp VALUES ('abe',2,'f2') insert into #temp VALUES ('abe',3,'f3') insert into #temp VALUES ('abe',4,'f6') insert into #temp VALUES ('abe',20,'f200') insert into #temp VALUES ('cbe',-1,'f0') insert into #temp VALUES ('cbe',1,'f1') insert into #temp VALUES ('cbe',2,'f2') insert into #temp VALUES ('cbe',3,'f3')
现在对于给定的链接,我需要获得最大'数字'和相应的'fname',它具有给定'链接'的最大'数字'。
1)例如:如果链接是'abc',则输出应为 abc,10,f100
2)例如:如果是'abe'则链接,输出应该是 abe,20,f200
3)现在链接也可以作为模式给出,比如(像'ab%'这样的链接),所以输出应该是
abc,10,f100
abe,20,f200
4)如果(链接像'cb%'),那么输出应该是 cbe,3,f3
通过查询编写此组的任何帮助。我有一个使用CAST和string concat的解决方案,如下所示,但这似乎效率不高。
select link,number,fname from #temp
where link like 'ab%' and link+'_'+CAST(number AS varchar(255))
in (select link+'_'+CAST(MAX(number) AS varchar(255)) from #temp
group by link)
谢谢..
答案 0 :(得分:4)
SELECT x.link,
x.number,
x.fname
FROM #temp x
JOIN (SELECT t.link,
MAX(t.number) AS max_number
FROM #temp t
GROUP BY t.link) y ON y.link = x.link
AND y.max_number = x.number
WITH cte AS (
SELECT x.link,
x.number,
x.fname,
ROW_NUMBER() OVER(PARTITION BY x.link
ORDER BY x.number DESC) rank
FROM #temp x)
SELECT c.link,
c.number,
c.fname
FROM cte c
WHERE c.rank = 1