我有一张表格如下:
ID Name Color
------------
1 Bob Blue
2 John Yellow
1 Bob Green
3 Sara Red
3 Sara Green
我想要做的是返回一个过滤的结果列表,从而返回以下数据:
ID Name Color
------------
1 Bob Blue
2 John Yellow
3 Sara Red
即。我想每个用户返回1行。 (我不介意为特定用户返回哪一行 - 我只需要[ID]是唯一的。)我已经有了一些有用的东西,但我真的很慢,我创建了一个临时表,添加了所有的ID,然后使用了“OUTER APPLY”选择同一表中的前1位,即
CREATE TABLE #tb
(
[ID] [int]
)
INSERT INTO #tb
select distinct [ID] from MyTable
select
T1.[ID],
T2.[Name],
T2.Color
from
#tb T1
OUTER APPLY
(
SELECT TOP 1 * FROM MyTable T2 WHERE T2.[ID] = T1.[ID]
) AS V2
DROP TABLE #tb
有人可以建议我如何改进吗?
由于
答案 0 :(得分:1)
尝试:
WITH CTE AS
(
SELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) AS 'RowNo',
ID, Name, Color
FROM table
)
SELECT ID,Name,color
FROM CTE
WHERE RowNo = 1
或
select
*
from
(
Select
ID, Name, Color,
rank() over (partition by Id order by sum(Name) desc) as Rank
from
table
group by
ID
)
HRRanks
where
rank = 1
答案 1 :(得分:0)
如果您使用的是SQL Server 2005或更高版本,则可以使用排名功能,只需抓住列表中的第一个。