【问题标题】:SQL: group by multiple limitsSQL:按多个限制分组
【发布时间】:2019-10-25 01:48:11
【问题描述】:

我有一个简单的表,id,key,level,table和data是这样的:

id key level
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 数组(数据库支持在操作中查找),我只想计算给定 id 列表中的最高级别并按键分组。 例如:我传入[2,3],返回的数据应该是:

key toplevel count
a     3        1

我传入[2,3,8,9],返回的数据应该是:

key toplevel count
a     3        1
c     2        2

不知道我的问题有没有描述清楚(英文不好),不懂的可以问我。

【问题讨论】:

  • 我的回答很冗长,希望你能转换成逻辑。首先使用传入的数组过滤出您想要的行,将其称为表 X。然后执行 (Select key, level, count(*) from X group by key, level) 作为 Y。现在按 desc 顺序逐级使用 row_number 函数并只保留第一行。
  • 它确实有效:我可以像这样使用 sql:select * from (select *,"row_number"() over (PARTITION by key order by LEVEL desc) rn from (select key,level,count(*) as counts from (select * from tbl_test where id in (2,3,8,9)) as idlist group by key,level) as tmp1) as tmp2 where rn = 1 ;@karanpatel
  • 先搞清楚你用的是哪个RDBMS,然后看meta.stackoverflow.com/questions/333952/…

标签: mysql sql postgresql group-by


【解决方案1】:

这将在 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 中的 row_number 或者我认为在最新版本的 MySQL 中应该有类似的功能可以使用。

【讨论】:

  • 是的,我也参考了你的cmets得到了这个SQL语句。还有什么不使用ROW_NUMBER()的想法吗?
【解决方案2】:

我创建了与您类似的数据并进行了测试。这似乎对我有用。请试试这个。

select a.`key`, a.level, count(*) as cnt 
from (select `key`, max(level) as toplevel from mytable group by `key`) b
     left join mytable a on a.`key` = b.`key` and a.level = b.toplevel and a.id in (2,3,8,9)
where a.`key` is not null
group by a.`key`, a.level

【讨论】:

  • 你错过了什么,在我的postgresql & mysql中执行你的SQL后报错
  • 我已经修改了答案,可能是因为列名“key”的原因,必须用引号括起来,这样才能执行
  • 在 postgresql 中,错误是:ERROR: column "a.toplevel" must appear in the GROUP BY clause or be used in an aggregate function LINE 15: select key, toplevel, count(*) as cnt 。在 mysql 中,它可以工作,但是当我传入 [2,3,8,9] 时返回的数据似乎错误?它返回a 3 1, c 2 1,而不是a 3 1, c 2 2
  • 修改了答案。你可以再试一次
【解决方案3】:

您将替换密钥中的 keyValue。 我的表名是 [dbo].[Table_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 

【讨论】:

    【解决方案4】:

    试试这个。

    Select key,MAX(level) as toplevel,COUNT(level) as count from tablename group by key
    

    max 获取 level 中的最大值。

    【讨论】:

    • 不幸的是这不是我想要的,你不能只使用计数(级别),我需要的是顶层计数。使用你的sql,我传入[2,3],返回的数据是:key toplevel count : a 3 2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    相关资源
    最近更新 更多