[英]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 BY
和MIN()
来获得结果。
让我们说你有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.