使用 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 BY
或MIN
错了吗?还有其他方法可以完成选择每个 TypeID ContentID 对的第一条记录的任务吗?
【问题讨论】:
将min()
更改为max()
不应更改返回的行数。
如果我添加ORDER BY ID
,您的SELECT MIN(ID)
查询将为我返回预期结果。两种情况下的行数都是 5。
@GordonLinoff 我知道 min() 和 max() 不应该返回不同数量的行,因此我的问题。
【参考方案1】:
MIN()
和 MAX()
应该返回相同数量的行。更改函数不应更改查询中返回的行数。
这个查询是更大查询的一部分吗?通过查看提供的示例数据,我会假设此代码只是您尝试执行的更大操作的 sn-p。您以后是否尝试将TypeID
、ContentID
或FolderID
与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最大的那一行