Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL:按多个限制分组_Mysql_Sql_Postgresql_Group By - Fatal编程技术网

Mysql SQL:按多个限制分组

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 我不知道我的问题是否描述得很清楚。我不擅长英语,如果你不懂,请问我。

我有一个简单的表,其中包含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语句。还有没有其他想法 使用行号?