在case语句中未计算的字段

问题描述 投票:0回答:1

使用PostgreSQL 9.6。我想计算一列中两个其他值之间的值的次数。

在这个例子中,我正在搜索“mid”列,结果应该是5.如果我对值进行硬编码但是这是不可接受的。当使用字段值给出答案为20时,它会失败。它似乎完全忽略了低字段和高字段。

为什么在第二种情况声明中没有评估“低”和“高”字段?我该如何解决这个问题?

SELECT low, mid, high,
        sum(case when mid between 35  and 57   then 1 end) over(partition by mid between 35  and 57) as "StaticNums",
        sum(case when mid between low and high then 1 end) over(partition by mid between low and high) as "non-StaticNums"
FROM
    (SELECT l-11 as low, l as mid, l+11 as high
        FROM generate_series(1,100,5) as l(n)
        group by l.n
     ) as t
group by mid, low, high
order by mid

我添加了一张我正在寻找使用excel的结果的图片。简而言之,我希望每行计算给定范围内的小部件数量(使用低值和高值以及中间作为小部件)。但是如何在sql中执行此操作?

Excel image showing example of what I'd like to accompish

sql postgresql
1个回答
0
投票

您的第一个CASE语句计算MID在35到57之间的次数,然后在35到57之间的行上显示该结果。(结果为5,它显示这五行的值)。 第二个CASE语句计算MID在LOW和HIGH之间的次数,然后在每一行都显示该结果。有20行,每行满足条件,因此每行显示20行。 因此,您的代码似乎正在执行您希望它执行的操作,这就是屏幕截图中显示的内容。如果您希望“StaticNums”在每一行中显示“5”,那么您的分区不应仅减少到导致该条件的行,因此请尝试以下代码:

SELECT low, mid, high,
        sum(case when mid between 35  and 57   then 1 end) over(partition by 1 = 1) as "StaticNums",
        sum(case when mid between low and high then 1 end) over(partition by mid between low and high) as "non-StaticNums"
FROM
    (SELECT l-11 as low, l as mid, l+11 as high
        FROM generate_series(1,100,5) as l(n)
        group by l.n
     ) as t
group by mid, low, high
order by mid
© www.soinside.com 2019 - 2024. All rights reserved.