SQL Server Simple Group by query

时间:2010-11-20 03:40:50

标签: sql sql-server tsql

我有一个简单的问题,虽然我相信它的简单,但我无法弄清楚。

考虑我的下表与下面给出的数据完全相同:

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)

谢谢..

1 个答案:

答案 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

使用CTE和ROW_NUMBER(SQL Server 2005 +):

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