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

Posted

技术标签:

【中文标题】使用 GROUP BY,选择每个组中 ID 最低的记录 ID【英文标题】:Using GROUP BY, select ID of record in each group that has lowest ID 【发布时间】:2016-03-11 07:13:36 【问题描述】:

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

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 BYMIN 错了吗?还有其他方法可以完成选择每个 TypeID ContentID 对的第一条记录的任务吗?

【问题讨论】:

min() 更改为max() 不应更改返回的行数。 如果我添加ORDER BY ID,您的SELECT MIN(ID) 查询将为我返回预期结果。两种情况下的行数都是 5。 @GordonLinoff 我知道 min() 和 max() 不应该返回不同数量的行,因此我的问题。 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

你能详细解释一下吗?这如何为我提供每对的所有第一个 ID 的列表? @TotZam sql server 有这个漂亮的函数msdn.microsoft.com/en-us/library/ms186734.aspx,例子很好地展示了它是如何工作的。编辑只得到 ID 列【参考方案3】:

与 ORDER BY 一起使用:

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

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

【讨论】:

【参考方案4】:

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

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

有效吗?

【讨论】:

***.com/questions/1881728/…

以上是关于使用 GROUP BY,选择每个组中 ID 最低的记录 ID的主要内容,如果未能解决你的问题,请参考以下文章

从 3 个表中选择,在两个 group by 之前有两个 order by

mysql在group by之后如何获取每一组中id最大的那一行

mysql在group by之后如何获取每一组中id最大的那一行

GROUP BY 如果组中至少一个值满足条件,则创建组

为每个用户选择最新条目而不使用 group by (postgres)

GROUP BY ID 并选择 MAX