Mysql SQL:按多个限制分组
我有一个简单的表,其中包含id、键、级别、表和数据如下: id密钥级别 1 a 1 2 a 2 3 a 3 4 a 3 5 b 1 6 b 3 7 c 1 8 c 2 9 c 2 问题是:我传入一个id数组,数据库支持find in操作,我只想按键统计给定id列表和组中的最高级别。 例如:我传入[2,3],返回的数据应该是: 键顶级计数 a 3 1 我传入[2,3,8,9],返回的数据应为: 键顶级计数 a 3 1 c 2 2 我不知道我的问题是否描述得很清楚。我不擅长英语,如果你不懂,请问我。试试这个Mysql SQL:按多个限制分组,mysql,sql,postgresql,group-by,Mysql,Sql,Postgresql,Group By,我有一个简单的表,其中包含id、键、级别、表和数据如下: id密钥级别 1 a 1 2 a 2 3 a 3 4 a 3 5 b 1 6 b 3 7 c 1 8 c 2 9 c 2 问题是:我传入一个id数组,数据库支持find in操作,我只想按键统计给定id列表和组中的最高级别。 例如:我传入[2,3],返回的数据应该是: 键顶级计数 a 3 1 我传入[2,3,8,9],返回的数据应为: 键顶级计数 a 3 1 c 2 2 我不知道我的问题是否描述得很清楚。我不擅长英语,如果你不懂,请问我。
Select key,MAX(level) as toplevel,COUNT(level) as count from tablename group by key
Max从level中获取最高值。试试这个
Select key,MAX(level) as toplevel,COUNT(level) as count from tablename group by key
Max从level中获取最高值。我创建了与您类似的数据并进行了测试。这似乎对我有用。请试试这个 选择a.`key`、a.level、count*as cnt 从中选择'key',maxlevel作为mytable组中的toplevel,按'key`b 在2,3,8,9中左键连接a.key`=b.key`和a.level=b.toplevel和a.id上的mytable a 其中,`key`不为空 按a.`key`,a.level分组
我创建了与您相似的数据并进行了测试。这似乎对我有用。请试试这个 选择a.`key`、a.level、count*as cnt 从中选择'key',maxlevel作为mytable组中的toplevel,按'key`b 在2,3,8,9中左键连接a.key`=b.key`和a.level=b.toplevel和a.id上的mytable a 其中,`key`不为空 按a.`key`,a.level分组
这将在PostgreSQL中起作用
Select * from(
Select
keyss,
levels,
counts,
ROW_NUMBER() OVER ( partition by keyss
order by levels desc) as rownum
from
(Select keyss, levels, count(*) as counts from test where id in (2,3,4,5) group by keyss, levels) as X
) as Y
Where Y.rownum = 1;
您可以在MySQL中模拟行数,或者我认为在最新版本的MySQL中应该有类似的函数可以使用 这将在PostgreSQL中起作用
Select * from(
Select
keyss,
levels,
counts,
ROW_NUMBER() OVER ( partition by keyss
order by levels desc) as rownum
from
(Select keyss, levels, count(*) as counts from test where id in (2,3,4,5) group by keyss, levels) as X
) as Y
Where Y.rownum = 1;
您可以在MySQL中模拟行数,或者我认为在最新版本的MySQL中应该有类似的函数可以使用 您将替换密钥中的keyValue。 我的表名是[dbo]。[表2] 请测试一下这个
select a.keyValue,a.level,MAX(rownum) as count from(
Select
keyValue,
level,
ROW_NUMBER() OVER ( partition by keyValue
order by level desc ) as rownum
from
[dbo].[Table_2]) as a
inner join
(select MAX(level) as level,keyValue from [dbo].[Table_2]
group by keyValue) b
on (a.level=b.level)and(a.keyValue=b.keyValue)
group by a.keyValue ,a.keyValue,a.level
您将替换密钥中的keyValue。 我的表名是[dbo]。[表2] 请测试一下这个
select a.keyValue,a.level,MAX(rownum) as count from(
Select
keyValue,
level,
ROW_NUMBER() OVER ( partition by keyValue
order by level desc ) as rownum
from
[dbo].[Table_2]) as a
inner join
(select MAX(level) as level,keyValue from [dbo].[Table_2]
group by keyValue) b
on (a.level=b.level)and(a.keyValue=b.keyValue)
group by a.keyValue ,a.keyValue,a.level
我的回答是冗长的,希望你能转换成逻辑。首先使用传入的数组筛选出需要的行,称之为表X。然后从X中选择键、级别、计数*,按键分组,级别为Y。现在使用行数函数按描述顺序逐级排序,只保留第一行。它确实有效:我可以像这样使用sql:选择*从选择*,分区上的行数按键顺序按级别描述从select key开始,级别,计数*作为从select*开始的计数从tbl_测试开始,其中id在2,3,8,9中作为idlist group by key,级别在tmp1中作为tmp2,其中rn=1@KaranPetel首先找出您使用的是哪种RDBMS,然后看看我的答案是详细的,希望您能转换成逻辑。首先使用传入的数组筛选出需要的行,称之为表X。然后从X中选择键、级别、计数*,按键分组,级别为Y。现在使用行数函数按描述顺序逐级排序,只保留第一行。它确实有效:我可以像这样使用sql:选择*从选择*,分区上的行数按键顺序按级别描述从select key开始,级别,计数*作为从select*开始的计数从tbl_测试开始,其中id在2,3,8,9中作为idlist group by key,级别在tmp1中作为tmp2,其中rn=1@KaranPetel首先找出您使用的是哪种RDBMS,然后不幸地看到它不是我想要的,您不能只使用countlevel,我需要的是toplevel的计数。使用您的sql,我传入[2,3],返回的数据是:key toplevel count:a 3 2不幸的是,这不是我想要的,您不能只使用countlevel,我需要的是toplevel的计数。使用你的sql,我传入[2,3],返回的数据是:key toplevel count:a 3 2Did你错过了什么,在我的postgresql中执行你的sql后报告一个错误&mysqlI已经修改了答案,可能是因为列名key,必须将其括在引号中,以便可以在postgresql中执行,错误是:错误:列a.toplevel必须出现在GROUP BY子句中,或者在聚合函数行15中使用:select key、toplevel、count*作为cnt。在mysql中,它可以工作,但当我传入[2,3,8,9]时返回的数据似乎是错误的?它返回一个3 1,c 2 1,而不是一个3 1,c 2修改后的答案。你可以再试一次,如果你错过了什么,在我的postgresql中执行你的SQL后报告一个错误&mysqlI已经修改了答案,可能是因为列名键,必须将其包装在引号中,以便在postgresql中执行,错误是:错误:列a.toplevel必须出现在GROUP BY子句中,或者在聚合函数行15中使用:select key、toplevel、count*作为cnt。在mysql中,它可以工作,但当我传入[2,3,8,9]时返回的数据似乎是错误的?它返回一个3 1,c 2 1,而不是一个3 1,c 2修改后的答案。你可以再试一次是的,我也通过引用你的评论得到了这条SQL语句。还有没有不使用行号的想法?是的,我也通过引用你的评论得到了这条SQL语句。还有没有其他想法 使用行号?