查找符合条件

时间:2017-01-21 21:08:27

标签: sql postgresql

我已经创建了一个包含Postgres的表格,用于计算电子邮件地址在层次结构的每个级别中显示的次数。层次结构的级别从左到右排序 - 也就是说,区域汇总到品牌,区域汇总到区域,站点汇总到区域。

我的目标是填充列" lowest_distinct_level"具有电子邮件地址不同的最低层级的名称。这是以下发布的示例表:

email_address   | brand | region | area | site | lowest_distinct_level
----------------|-------|--------|------|------|----------------------
alpha@gmail.com |   1   |    1   |   1  |   2  |
beta@gmail.com  |   1   |    1   |   2  |   0  |
gamma@gmail.com |   1   |    1   |   2  |   2  |
zeta@gmail.com  |   1   |    2   |   0  |   0  |
  • Alpha的电子邮件显示在两个站点中但只有一个区域,因此lower_distinct_level应填充" area"。
  • Beta的电子邮件显示在两个区域,但只有一个区域,所以"区域"应填充。
  • Gamma的电子邮件显示在两个网站中,但这两个网站位于不同的区域。因此,"地区"应填充。
  • Zeta的排应该说"品牌"。

简而言之,对于每一行,我需要找到值最大的最右列,并将该列的名称作为值输出到lowest_distinct_level。有没有一种相对有效的方法来使用PLPGSQL或数组来实现这一目标?我一般不擅长编写脚本或编码,所以如果这是微不足道的话,请道歉。

2 个答案:

答案 0 :(得分:2)

这是使用嵌套CASE的基本解决方案:

{
    "compilerOptions": {
        "target": "es5",
        "module": "commonjs",
        "moduleResolution": "node",
        "sourceMap": true,
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "removeComments": false,
        "noImplicitAny": false
    }
}

结果如下:

In [307]: df = pd.DataFrame(np.random.randint(0, 1000, (10,3)), columns=list('abc'))

In [308]: df
Out[308]:
     a    b    c
0  755  250  450
1  142  810  460
2  814  268  204
3  534  546  837
4  373  246  266
5  158  775  560
6  451  503   85
7  988  265  703
8  164  503  239
9  578  188   76

In [309]: df.mean()
Out[309]:
a    495.7
b    435.4
c    388.0
dtype: float64

In [310]: df.gt(df.mean(), axis=1).any(1)
Out[310]:
0     True
1     True
2     True
3     True
4    False
5     True
6     True
7     True
8     True
9     True
dtype: bool

In [311]: df.loc[df.gt(df.mean(), axis=1).any(1)]
Out[311]:
     a    b    c
0  755  250  450
1  142  810  460
2  814  268  204
3  534  546  837
5  158  775  560
6  451  503   85
7  988  265  703
8  164  503  239
9  578  188   76

Abelisto写了一个简短的版本:

select email_address, brand, region, area, site,
    case when site = 1 then 'site'
         else case when area = 1 then 'area'
              else case when region = 1 then 'region'
                   else case when brand = 1 then 'brand'
                             else ''
                             end
                        end       
                   end
         end as lowest_distinct_level 
from mm;

在此处查看:http://rextester.com/HSYJT82278

答案 1 :(得分:1)

这确实可以用数组来解决:

<span>
   <img class="hover item-fade" src="" />
</span>