繁体   English   中英

选择DISTINCT,返回整行

[英]Select DISTINCT, return entire row

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

我怎样才能做到这一点?

如果第6列显示如下:

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

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

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

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

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

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

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

更新:

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

您可以对Col006进行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
select * from yourTable where column6 in (select distinct column6 from yourTable);

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

让我们说你有id作为primary_key 我们希望得到列的所有DISTINCT值,比如说estimated_total并且还需要一个完整行的样本,其中包含SQL中的每个不同值 以下查询应该可以解决问题。

SELECT *, min(id)
FROM harvest 
GROUP BY estimated_total;
SELECT *
FROM (SELECT DISTINCT YourDistinctField FROM YourTable) AS A
CROSS APPLY 
( SELECT TOP 1 * FROM YourTable B 
  WHERE B.YourDistinctField = A.YourDistinctField ) AS NewTableName

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM