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



我有一个我认为非常标准的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 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;

据我了解,您想过滤非活动计数= 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小提琴。

最新更新