【问题标题】:SQLite How to Group data according to custom rulesSQLite 如何根据自定义规则对数据进行分组
【发布时间】:2020-12-29 15:54:42
【问题描述】:

我有一张如下表。 如果我对name字段进行分组操作,b的key是11,但我需要留下的是12,因为12已经出现在其他记录中。 在不使用最大聚合方法的情况下,我应该怎么做才能达到这个结果

介绍表的含义, key-12也提供name-a、name-b,key-11只提供name-b 对于name-c,可以提供name-c的key有3个,不再重复

|name|key|
| a | 12 |
| b | 11 |
| b | 12 |
| c | 15 |
| c | 14 |
| c | 17 |
....

我希望通过group by得到的结果是:

|name|key |
| a  | 12 |
| b  | 12 |
| c  | 15 | 

通过名称字段执行分组操作, b需要离开key-12,因为key-12同时提供name-a和name-b, 所以不需要 key-11。

对于name-c,可以提供name-c的key有3个,都不重复,我们就用第一次出现的那个吧。

【问题讨论】:

  • 你想要的输出是什么?
  • 你需要解释一下我们知道密钥12属于name = a而不是name = b的逻辑。
  • 我在问题中添加了描述,非常感谢

标签: python sql sqlite count window-functions


【解决方案1】:

假设key 对于每个name 都是唯一的,您可以使用COUNT()ROW_NUMBER() 窗口函数:

select name, key
from (
  select *, row_number() over (partition by name order by counter desc, rowid) rn
  from (
    select *, rowid, count(*) over (partition by key) counter
    from tablename
  )
) 
where rn = 1 

请参阅demo
结果:

> name | key
> :--- | --:
> a    |  12
> b    |  12
> c    |  15

【讨论】:

  • 非常酷,非常感谢,但它可能无法解决我的问题。 Sql 发现我对key使用了排序。事实上,我不想为这个键排序。这只是一个标志。我想判断他是否出现在其他记录中,以确定是直接使用这条记录还是原来group by rule生成的记录。
  • @tomtao 这段代码没有按键排序。它计算一个键在表中出现的次数,以决定为每个名称返回哪个键。最后,出现最多的键是您为每个名称获得的键。
  • @foroas 我可能不太明白你的代码,还需要提高相应的技巧,可能我问题表达的不是很清楚,你的代码暂时解决不了我的问题,谢谢你非常喜欢。我考虑重新描述这个问题。谢谢。
  • 我的代码解决了您描述的问题。如果您有不同的要求,请提出一个新问题。
  • 非常感谢您的帮助。我将重新描述这个问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多