帮助选择MS Sql Select语句

时间:2010-10-29 19:09:39

标签: sql unique

我有一张如下表所示的表格:

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语法。

再次感谢您的帮助。

5 个答案:

答案 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}} Cat7而不是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