我有一张如下表所示的表格:
UserID Num1 Num2 Code Name Cat
7293 32:16.0 50:22.0 3 Jim 33
7293 32:16.0 59:28.0 4 Jim 12
7316 32:16.0 55:32.0 4 Karen 33
7316 32:16.0 28:31.0 4 Karen 7
7287 32:16.0 01:27.0 2 Mike 33
7299 32:16.0 18:53.0 4 Sue 16
7302 32:17.0 54:54.0 4 Bill 28
7302 32:17.0 01:26.0 4 Bill 10
7302 32:17.0 01:26.0 3 Bill 32
我试图选择唯一的行。我需要输出为:
UserID Num1 Num2 Code Name Cat
7293 32:16.0 50:22.0 3 Jim 33
7316 32:16.0 28:31.0 4 Karen 7
7287 32:16.0 01:27.0 2 Mike 33
7299 32:16.0 18:53.0 4 Sue 16
7302 32:17.0 54:54.0 4 Bill 28
我不是SQL专家所以非常感谢任何帮助。
我尝试使用带有DISTINCT的SELECT语句,但这只给了我一列,我需要整行。如果我在SELECT中使用DISTINCT放置多个字段,它将返回所有行。
感谢您的帮助。
好的,回答我收到的一些回复:
1)我尝试了很多查询,但都基于: SELECT DISTINCT UserID FROM MyTable SELECT DISTINCT *来自MyTable SELECT DISTINCT UserID,Num1,Num2,Code,Name,Cat FROM MyTable
同样,我不是SQL专家,而且我读到的关于DISTINCT的所有内容都没有我需要的真实例子。
2)然而,阅读回复给了我一个想法,因为我真的只需要几个列,例如UserID,Name,
我可以使用DISTINCT并仅指定这些列吗?嗯,我会尝试一下。
3)我不确定回复中Min,Max的内容是什么,但我会尝试并希望在此过程中更好地理解SQL语法。
再次感谢您的帮助。
答案 0 :(得分:4)
您需要汇总您不想分组的字段,例如:
select UserID, min(Num1), min(Num2), min(Code), min(Name), max(Cat)
from tbl
group by userID
答案 1 :(得分:0)
我不知道这是否是最佳方式,但一种方法是使用分组:
select UserId, min(Num1), min(Num2), min(Code), min(Name), min(Cat)
from tbl group by UserId
好吧,这会给你Jim 12
而不是Jim 33
,但我想你可以找出一个能给你正确行的聚合函数。
答案 2 :(得分:0)
1)如果这是家庭作业,请将其标记为,然后展示您之前的一些尝试(人们更愿意帮助那些投入诚实努力并陷入困境的人,而不是寻找免费答案)。如果你已经证明你已经筋疲力尽,你会得到更多的尊重,帮助和信任。
2)确切输入和确切输出是否正确?令我感到奇怪的是Karen
的{{1}} Cat
而7
而不是33
的'回答'。每个其他用户都选择了第一个值。
答案 3 :(得分:0)
您似乎希望每个UserID都有“TOP 1”结果。
在代码端执行此操作比SQL端更容易,但这是可能的。
一种方法是生成不同UserID的列表:
SELECT DISTINCT UserID FROM @YourTable
使用游标迭代每个ID并将每个“TOP 1”记录插入临时表:
DECLARE @TempTable TABLE (
UserID INT,
Num1 VARCHAR(10),
Num2 VARCHAR(10),
Code INT,
Name VARCHAR(10),
Cat INT
)
DECLARE @ID INT
DECLARE MyCursor CURSOR FOR
SELECT DISTINCT UserID FROM @YourTable
OPEN MyCursor
FETCH NEXT FROM MyCursor INTO @ID
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO @TempTable
SELECT TOP 1 * FROM @YourTable WHERE UserID = @ID
FETCH NEXT FROM MyCursor
INTO @ID
END
CLOSE MyCursor
DEALLOCATE MyCursor
现在,您想要的记录应该在@TempTable
中SELECT * FROM @TempTable
7287 32:16.0 01:27.0 2 Mike 33
7293 32:16.0 50:22.0 3 Jim 33
7299 32:16.0 18:53.0 4 Sue 16
7302 32:17.0 54:54.0 4 Bill 28
7316 32:16.0 55:32.0 4 Karen 33
*注意:我的数据类型映射可能与您的不匹配。
答案 4 :(得分:0)
此查询不会假设您所需的每个用户的行数等级。要将查询排名为接受“某个”最高值,您必须更改'OVER'语句中对于'ROW_NUMBER()'函数的order by子句
with partTable (rw_num,UserID,Num1,Num2,Code,Name,Category) as
(select
ROW_NUMBER() over(partition by UserID order by UserID) as rw_num
,UserID
,Num1
,Num2
,Code
,Name
,Category
from table_1)
select
UserID
,Num1
,Num2
,Code
,Name
,Category
from partTable where rw_num = 1