SQL SELECT DISTINCT和GROUP BY问题

时间:2010-12-05 18:07:21

标签: sql mysql sql-server

我需要每个特定的数据库条目只返回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”号的所有其他行

2 个答案:

答案 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)

编辑:发布查询的比较 alt text

EDIT2:发布实际查询执行计划的比较,随机生成约2000行数据,id为具有唯一索引的标识列。 id和col1的第二个索引。 alt text

事实证明,Marc的查询毕竟更快,至少对于这些数据!