我有一个包含10列的表格。 我想返回Col006不同的所有行,但返回所有列...
我该怎么做?
如果第6列显示如下:
| Column 6 |
| item1 |
| item1 |
| item2 |
| item1 |
我想返回两行,其中一条记录包含item1,另一条记录包含item2,以及所有其他列。
答案 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 BY
和MIN()
来获得结果。
假设您id
为primary_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