我需要每个特定的数据库条目只返回1行。对于例如如果我有:
ID col1 col2
1 1 A
2 1 B
3 1 C
4 2 D
5 3 E
6 4 F
7 4 G
在MySQL中我可以运行查询
SELECT DISTINCT col1, col2 FROM table GROUP BY col1
我会得到 - >
ID col1 col2
1 1 A
4 2 D
5 3 E
6 4 F
这就是我想要的,但如果我在SQL Server中运行相同的查询,我会收到错误..
所以,基本上我只需要从表中的每一行返回一个(或FIRST)“col1”及其“col2”..
SQL Server的正确语法是什么?
感谢您的时间!
的Andrej
编辑:
在mysql中运行的完整查询是 - >
SELECT DISTINCT list_order, category_name, category_id
FROM `jos_vm_category`
WHERE `category_publish` = 'Y'
GROUP BY list_order
所以,对于每个“list_order”号我希望从该行返回category_name和category_id,并忽略具有相同“list_order”号的所有其他行
答案 0 :(得分:2)
另一种方法是在T-SQL中使用ROW_NUMBER()
函数,它允许您通过某种东西“分区”数据 - 比如这里的col1
- 并为每个数据获取增量数字分区。如果你只想要每个“分区”的第一个条目,只需这样查询(使用公用表表达式 - CTE):
;WITH Distincts AS
(
SELECT ID, col1, col2,
ROW_NUMBER() OVER (PARTITION BY col1 ORDER BY ID) AS 'RowNo'
FROM dbo.Table
)
SELECT
ID, col1, col2
FROM
Distincts
WHERE
RowNo = 1
这为我提供了您正在寻找的输出。
答案 1 :(得分:0)
您可以获取与col1中第一个值实例对应的所有行,如下所示
SELECT col1, col2
FROM table t1
where not exists
(select 1
from table t2
where t2.col1 = t1.col1 and
t2.id < t1.id)
编辑:发布查询的比较
EDIT2:发布实际查询执行计划的比较,随机生成约2000行数据,id为具有唯一索引的标识列。 id和col1的第二个索引。
事实证明,Marc的查询毕竟更快,至少对于这些数据!