选择DISTINCT,返回整行

时间:2010-08-19 07:32:16

标签: sql sql-server

我有一个包含10列的表格。 我想返回Col006不同的所有行,但返回所有列...

我该怎么做?

如果第6列显示如下:

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

我想返回两行,其中一条记录包含item1,另一条记录包含item2,以及所有其他列。

7 个答案:

答案 0 :(得分:9)

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()

答案 1 :(得分:2)

SQL中的关键词“DISTINCT”具有“唯一值”的含义。当应用于查询中的列时,它将从结果集中返回尽可能多的行,因为该列具有唯一的不同值。因此,它创建了一个分组结果集,其他列的值是随机的,除非由其他函数定义(例如max,min,average等)。

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

如果您想要返回Col006与Col006的所有其他值不同的所有行,那么您仍然需要指定该值是什么=&gt;见上文。

如果您想说只有在检索完所有行后才能评估Col006的值,那么请使用“having Col006 = value”子句。这与“where”子句具有相同的效果,但是当从原始表中检索行时应用“where”,而在完成所有其他计算后应用“having”(即已运行聚合函数等)就在结果集返回给用户之前。

<强>更新

在看过你的编辑之后,我必须指出,如果你使用任何其他建议,你将在Col006中包含值“item1”的行的所有其他9列中的随机值结束,到期在我的帖子中进一步提高了约束力。

答案 2 :(得分:1)

您可以对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

答案 3 :(得分:1)

SELECT *
FROM (SELECT DISTINCT YourDistinctField FROM YourTable) AS A
CROSS APPLY 
( SELECT TOP 1 * FROM YourTable B 
  WHERE B.YourDistinctField = A.YourDistinctField ) AS NewTableName

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

答案 4 :(得分:1)

select * from yourTable where column6 in (select distinct column6 from yourTable);

答案 5 :(得分:1)

您可以使用GROUP BYMIN()来获得结果。

假设您idprimary_key。 我们希望获得列的所有DISTINCT值,例如estimated_total您还需要一个完整行样本,其中包含SQL 中的每个不同值。以下查询应该可以解决问题。

SELECT *, min(id)
FROM harvest 
GROUP BY estimated_total;

答案 6 :(得分:-1)

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