SQL 如果存在多行,则计算一行
SQL count one row if many exist
我有一个我认为非常标准的 Postgres SQL 问题。我可以解释,就是不会编程。
我有 4 行具有唯一的帐户 ID。这些行中的每一行都共享相同的经度和纬度值,但它们的物理地址不同(公寓 1A、公寓 2B.....)。每个帐户都有活动或非活动状态。每个帐户要么获得或不获得 HBO。
此数据全部来源于单个table。我的情况是这样的:
按纬度、经度和行政区名称分组,循环数据并计算一行,其中每个帐户都处于非活动状态并且至少有一个帐户仍在接收 HBO。
所以如果同时有4个账户lng/lat,3个不活跃但1个仍然活跃,记录被跳过。
如果同时有4个账号lng/lat,4个不活跃,none获取HBO,记录为skipped.
如果同时有4个账号lng/lat,4个不活跃,1个仍然获得HBO,记录为计数。
更新:
我需要这个作为城镇的计数。我只是使用 lat/lng 来确认逻辑是正确的,确实如此。我要寻找的最终结果是:
Borough | Count
---------------------
Bronx 50
Queens 12
您可以使用 GROUP BY
和 HAVING
获得 lat/long 对:
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 帐户的数量,并相应地过滤行。类似于 Gordon 的解决方案。
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.
我有一个我认为非常标准的 Postgres SQL 问题。我可以解释,就是不会编程。
我有 4 行具有唯一的帐户 ID。这些行中的每一行都共享相同的经度和纬度值,但它们的物理地址不同(公寓 1A、公寓 2B.....)。每个帐户都有活动或非活动状态。每个帐户要么获得或不获得 HBO。
此数据全部来源于单个table。我的情况是这样的: 按纬度、经度和行政区名称分组,循环数据并计算一行,其中每个帐户都处于非活动状态并且至少有一个帐户仍在接收 HBO。
所以如果同时有4个账户lng/lat,3个不活跃但1个仍然活跃,记录被跳过。
如果同时有4个账号lng/lat,4个不活跃,none获取HBO,记录为skipped.
如果同时有4个账号lng/lat,4个不活跃,1个仍然获得HBO,记录为计数。
更新: 我需要这个作为城镇的计数。我只是使用 lat/lng 来确认逻辑是正确的,确实如此。我要寻找的最终结果是:
Borough | Count
---------------------
Bronx 50
Queens 12
您可以使用 GROUP BY
和 HAVING
获得 lat/long 对:
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 帐户的数量,并相应地过滤行。类似于 Gordon 的解决方案。
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.