使用 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的行数。
这个查询是一个更大查询的一部分吗?通过查看提供的示例数据,我认为此代码只是您尝试执行的更大操作的片段。您稍后是否尝试将 TypeID
、ContentID
或 FolderID
与 ID 引用的表连接起来?
如果是,则此错误可能是由查询的另一部分引起的,而不是由 select 语句引起的。如果您使用连接或 multi-level select 语句,如果引用表不包含所有外部 ID 的记录,您可以获得不同数量的结果。
另一个建议,检查您的记录中是否有任何值是 NULL
。虽然这不应该影响 GROUP BY
,但我在处理 NULL
值时有时会遇到奇怪的行为。
我正在创建一个文件组织系统,您可以在其中将内容项添加到多个文件夹。 我将数据存储在具有类似于以下结构的 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的行数。
这个查询是一个更大查询的一部分吗?通过查看提供的示例数据,我认为此代码只是您尝试执行的更大操作的片段。您稍后是否尝试将 TypeID
、ContentID
或 FolderID
与 ID 引用的表连接起来?
如果是,则此错误可能是由查询的另一部分引起的,而不是由 select 语句引起的。如果您使用连接或 multi-level select 语句,如果引用表不包含所有外部 ID 的记录,您可以获得不同数量的结果。
另一个建议,检查您的记录中是否有任何值是 NULL
。虽然这不应该影响 GROUP BY
,但我在处理 NULL
值时有时会遇到奇怪的行为。