我有一个我认为非常标准的Postgres SQL问题。我可以解释它,只是不能编程。
我有 4 行具有唯一的帐户 ID。这些行中的每一行共享相同的经度和纬度值,但它们的实际地址不同(公寓 1A、公寓 2B......每个帐户的状态为活动或非活动。每个帐户要么获得HBO,要么不获得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
您可以使用GROUP BY
和HAVING
获取经度/经度对:
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;
据我了解,您想过滤非活动计数= 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小提琴。