代码之家  ›  专栏  ›  技术社区  ›  NinjaCat

选择distinct,返回整行

  •  8
  • NinjaCat  · 技术社区  · 15 年前

    我有一张10列的桌子。 我想返回col006不同的所有行,但返回所有列…

    我该怎么做?

    如果第6列显示如下:

    | Column 6 |
    | item1    | 
    | item1    | 
    | item2    | 
    | item1    | 
    

    我想返回两行,一行是带有item1的记录,另一行是带有item2的记录,以及所有其他列。

    7 回复  |  直到 8 年前
        1
  •  9
  •   Quassnoi    15 年前

    SQL Server 2005 及以上:

    ;WITH    q AS
            (
            SELECT  *, ROW_NUMBER() OVER (PARTITION BY col6 ORDER BY id) rn
            FROM    mytable
            )
    SELECT  *
    FROM    q
    WHERE   rn = 1
    

    SQL Server 2000 ,前提是您有主键列:

    SELECT  mt.*
    FROM    (
            SELECT  DISTINCT col6
            FROM    mytable
            ) mto
    JOIN    mytable mt
    ON      mt.id = 
            (
            SELECT  TOP 1 id
            FROM    mytable mti
            WHERE   mti.col6 = mto.col6
            -- ORDER BY
            --      id
            --  Uncomment the lines above if the order matters
            )
    

    更新:

    检查数据库版本和兼容性级别:

    SELECT  @@VERSION
    
    SELECT  COMPATIBILITY_LEVEL
    FROM    sys.databases
    WHERE   name = DB_NAME()
    
        2
  •  2
  •   wolfgangsz    15 年前

    SQL中的关键字“distinct”具有“unique value”的含义。当应用于查询中的列时,它将从结果集中返回与该列具有唯一、不同值相同的行。因此,它创建一个分组的结果集,而其他列的值是随机的,除非由其他函数(如max、min、average等)定义。

    如果您想说您想返回col006具有特定值的所有行,请使用“where col006=value”子句。

    如果您想说您想要返回col006与col006的所有其他值不同的所有行,那么您仍然需要指定该值是什么=>请参见上文。

    如果要说只有在检索完所有行后才能计算col006的值,请使用“having col006=value”子句。这与“where”子句的效果相同,但在从原始表中检索行时应用“where”,而在进行所有其他计算(例如,聚合函数已运行等)并将结果集返回给用户之前应用“having”。

    更新:

    在看过您的编辑之后,我必须指出,如果您使用任何其他建议,由于在我的文章中进一步受到约束,您将在col006中包含值“item1”的行的所有其他9列中得到随机值。

        3
  •  1
  •   Guffa    15 年前

    你可以分组 Col006 要获得不同的值,但是必须决定如何处理每个组中的多个记录。

    可以使用聚合从记录中选择值。例子:

    select Col006, min(Col001), max(Col002)
    from TheTable
    group by Col006
    order by Col006
    

    如果希望值来自每个组中的特定记录,则必须以某种方式标识它。使用col002标识每组记录的示例:

    select Col006, Col001, Col002
    from TheTable t
    inner join (
      select Col006, min(Col002)
      from TheTable
      group by Col006
    ) x on t.Col006 = x.Col006 and t.Col002 = x.Col002
    order by Col006
    
        4
  •  1
  •   davesbrain    15 年前
    SELECT *
    FROM (SELECT DISTINCT YourDistinctField FROM YourTable) AS A
    CROSS APPLY 
    ( SELECT TOP 1 * FROM YourTable B 
      WHERE B.YourDistinctField = A.YourDistinctField ) AS NewTableName
    

    我尝试了上面的答案,但没有运气…但这就是诀窍!

        5
  •  1
  •   Bhargav Rao rlgjr    9 年前
    select * from yourTable where column6 in (select distinct column6 from yourTable);
    
        6
  •  1
  •   Mohd Abdul Mujib    8 年前

    你可以使用 GROUP BY MIN() 得到结果。

    假设你有 id 作为 primary_key . 我们想得到 DISTINCT 列的值,比如 estimated_total , 您还需要一个完整行的示例,其中包含SQL中每个不同的值 . 下面的查询应该可以做到这一点。

    SELECT *, min(id)
    FROM harvest 
    GROUP BY estimated_total;
    
        7
  •  -1
  •   sealz    14 年前
    create table #temp
    (C1 TINYINT,
     C2 TINYINT,
     C3 TINYINT,
     C4 TINYINT,
     C5 TINYINT,
     C6 TINYINT)
    
    INSERT INTO #temp
     SELECT 1,1,1,1,1,6
     UNION ALL SELECT 1,1,1,1,1,6
     UNION ALL SELECT 3,1,1,1,1,3
     UNION ALL SELECT 4,2,1,1,1,6
    
    SELECT * FROM #temp
    
    SELECT *
    FROM(
    SELECT ROW_NUMBER() OVER (PARTITION BY C6 Order by C1) ID,* FROM #temp
    )T
    WHERE ID = 1