如果存在多个SQL,则SQL计数一行

时间:2018-01-06 02:07:22

标签: postgresql relational-database

我认为这是一个非常标准的Postgres SQL问题。我可以解释一下,就是不能编程。

我有4行具有唯一帐户ID。这些行中的每一行共享相同的经度和纬度值,但它们的物理地址不同(公寓1A,公寓2B .....)。每个帐户都处于活动或非活动状态。每个帐户获得或不获得HBO。

此数据全部来自单个表。我的情况是这样的: 按纬度,经度和自治市镇的名称进行分组,循环数据并计算每个帐户处于非活动状态的一行,并且至少有一个帐户仍然获得HBO。

因此,如果同一个lng / lat有4个帐户,3个处于非活动状态,但1个仍处于活动状态,则记录跳过

如果同一个lng / lat有4个账号,4个无效,没有HBO,记录跳过

如果同一个lng / lat有4个账户,4个无效,一个仍然获得HBO,记录计算

更新: 我需要这个作为城镇的计数。我只是使用lat / lng来确认逻辑是否正确而且确实如此。我正在寻找的最终结果是:

Borough | Count
---------------------
Bronx      50
Queens     12

2 个答案:

答案 0 :(得分:1)

您可以使用GROUP BYHAVING

获取纬度/经度
SELECT ml."LATITUDE", ml."LONGITUDE"
FROM "MasterListMN" ml
GROUP BY ml."LATITUDE", ml."LONGITUDE"
HAVING SUM( ("account_part_1" = 'INACT' AND "account_part_2" = 'INACT')::int) = COUNT(*) AND
       SUM( (ml."GETS_HBO" = 'TRUE')::int) > 0;

答案 1 :(得分:0)

根据我的理解,您希望过滤非活动计数= 4的行和活动的hbo帐户计数> 0.我分别计算非活动和hbo帐户的数量,并相应地过滤行。与戈登的解决方案类似。

SELECT lat, lon
FROM test
GROUP BY 1, 2
HAVING COUNT(CASE WHEN IS_active THEN 1 END) = 0 
    AND COUNT(CASE WHEN has_hbo THEN 1 END) > 0;

在此之后,您可以按行政区划分并计算。这是SQL Fiddle