使用 GROUP BY,select 每个组中具有最低 ID 的记录 ID

Using GROUP BY, select ID of record in each group that has lowest ID

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

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

我正在尝试 select 每个唯一的 TypeID 和 ContentID 对的第一条记录。对于上面的 table,我希望结果是:

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 错了?有没有另一种方法可以完成 selecting 每个 TypeID ContentID 对的第一条记录的任务?

与 ORDER BY 一起使用:

select *
from table
group by TypeID, ContentID
order by id

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

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

select first(id)
from table 
group by TypeID, ContentID

有效吗?

使用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

MIN()MAX() 应该 return 相同的行数。更改函数应该而不是更改查询中return的行数。

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

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