【问题标题】:Grouping similar rows and counting other columns based on it in SQL在 SQL 中对相似的行进行分组并根据它对其他列进行计数
【发布时间】:2015-02-14 13:19:12
【问题描述】:

我正在尝试对这样的结果表运行 SQL 查询:

  name   |  property   |   col1   |   col2  
___________________________________________ 

 abc     |  temp.a     |   1      |   0
 abc     |  temp.b     |   1      |   0
 abc     |  perm.a     |   1      |   1
 abc     |  date       |   0      |   0
 abc     |  perm.b     |   1      |   0

我想对所有相似的行进行分组,并将 col1 和 col2 计为 1,而不是求和,应该如下所示:

name   |   propertyname   |   count_col1   |  count_col2
___________________________________________________________
abc    |   temp.%         |   1            |  0
abc    |   perm.%         |   1            |  1
abc    |   date           |   0            |  0

我尝试了一些 sql 查询,但它不起作用。我也尝试使用公用表表达式(如'with'关键字),但有没有更好的编写 SQL 的方法?

【问题讨论】:

  • 对于temp.%perm.%count_col1 不会是 2 吗?如果它计算了底层行?
  • 到目前为止你尝试过什么?你的基础数据是什么样的?你怎么知道何时停止property 的匹配?比如说,如果你有一个'tent' 值,或者'temporary',或者别的什么,会发生什么?
  • @StuartLC 是的,count_col1 应该是 2。但是如果它有助于理解问题,请考虑这个例子:我有一个地址,例如。 34, gold street,brooklyn, NY, 11201。这个地址有很多部分,比如州、邮编、街道地址 1、街道地址 2,它们作为不同的字段存储在数据库中。如果这些部分中的任何一个被更新,那么我想将地址更新显示为 1(作为一个整体而不是显示 3 个不同的更新)。我希望我的例子很清楚?
  • @NehaMoharir 可以提供 DDL 和示例数据吗?
  • 与往常一样,表定义(psql 中的\d tbl)和您的 Postgres 版本会有所帮助。特别是,列可以为 NULL 吗?您的具体数据类型是什么?

标签: sql postgresql group-by common-table-expression


【解决方案1】:
SELECT name, split_part(property, '.', 1) AS propertyname
     , bool_or(col1) AS col1
     , bool_or(col2) AS col2
FROM   tbl
GROUP  BY 1, 2;

假设col1col2boolean(这里看起来最好)。如果你使用integer:

CASE WHEN sum(col1) > 0 THEN 1 ELSE 0 END AS col1

split_part() 在第一个点之前获取字符串的一部分,实现与您的示例相同。示例:

【讨论】:

    猜你喜欢
    • 2014-02-01
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    相关资源
    最近更新 更多