使用GROUP BY,选择ID最低的每个组中的记录ID

时间:2015-12-06 18:05:34

标签: sql sql-server select group-by min

我正在创建一个文件组织系统,您可以在其中将内容项添加到多个文件夹中。 我将数据存储在具有类似于以下结构的表中:

ID       TypeID    ContentID    FolderID
1         101        1001          1
2         101        1001          2
3         102        1002          3
4         103        1002          2
5         103        1002          1
6         104        1001          1
7         105        1005          2

我正在尝试为每个唯一的TypeID和ContentID对选择第一条记录。对于上表,我希望结果为:

  

ID
  1
  3
  4
  6
  7

正如你所看到的,对101 1001和103 1002分别被添加到两个文件夹中,但我只想要记录它们被添加到的第一个文件夹。

但是,当我尝试以下查询时,我只得到至少有两个具有相同TypeID和ContentID的条目的结果:

select MIN(ID)
from table
group by TypeID, ContentID

结果

  

ID
  1
  4

如果我将MIN(ID)更改为MAX(ID),我会得到正确数量的结果,但我会将记录添加到最后一个文件夹中,而不是第一个文件夹:

  

ID
  2
  3
  5
  6
  7

我使用GROUP BY还是MIN错了?还有另一种方法可以完成选择每个TypeID ContentID对的第一条记录的任务吗?

4 个答案:

答案 0 :(得分:1)

与ORDER BY:

一起使用
select *
from table
group by TypeID, ContentID
order by id

SQLFiddle:http://sqlfiddle.com/#!9/024016/12

答案 1 :(得分:1)

使用ROW_NUMBER

WITH CTE AS
(SELECT ID,TypeID,ContentID,FolderID,
ROW_NUMBER() OVER (PARTITION BY TypeID,ContentID ORDER BY ID) as rn FROM t
)
SELECT ID FROM CTE WHERE rn=1

答案 2 :(得分:1)

MIN()MAX()应返回相同数量的行。更改函数应该更改查询中返回的行数。

此查询是否是较大查询的一部分?通过查看提供的示例数据,我认为此代码只是您尝试执行的更大操作的片段。您是否稍后尝试加入TypeIDContentIDFolderID与ID引用的表格?
如果是,则此错误可能是由查询的另一部分而不是此select语句引起的。如果使用连接或多级选择语句,如果引用表不包含所有外部ID的记录,则可以获得不同的结果量。

另一个建议是,检查记录中的任何值是否为NULL。虽然这不应该影响GROUP BY,但在处理NULL值时,我有时会遇到奇怪的行为。

答案 3 :(得分:0)

尝试使用first(id)而不是min(id)

先选择(id) 从表 按类型ID分组,ContentID

有效吗?