【发布时间】:2017-04-04 02:20:48
【问题描述】:
所以我正在使用以下 postgresql 表:
对于每个 business_id,我想过滤掉那些 review_count 连续 2 个月(或行) 不超过特定 review_count 阈值的企业。根据 business_id 所在的城市,阈值会有所不同(例如,在上面的屏幕截图中,我们可以假设 city = Charlotte 的行的 review_count 阈值 >= 2,而 city = Las Vegas 的行具有review_count 阈值 >= 3。如果一个 business_id 没有至少一个连续月份实例的 review_counts 高于指定阈值,我想将其过滤掉。
我希望此查询仅返回满足此条件的业务 ID(以及表中与该业务 ID 一起出现的所有其他列)。此表的复合主键为 (business_id, year, month)。
您可能会注意到,数据中缺少某些月份(第二个 business_id 的第 9 个月)。如果是这种情况,我不想将 2 行算作“连续几个月”。例如,对于拉斯维加斯的业务,我不想将第 8 个月到第 10 个月视为“连续月份”,即使它们出现在连续的行中。
我已经尝试过这样的事情,但是有点撞墙并且认为它没有让我走远:
SELECT *
FROM us_business_monthly_review_growth
WHERE business_id IN (SELECT DISTINCT(business_id)
FROM us_business_monthly_review_growth
GROUP BY business_id, year, month
HAVING (city = 'Las Vegas'
AND (CASE WHEN COUNT(review_count >= 2 * 2.21) >= 2))
OR (city = 'Charlotte' AND (CASE WHEN COUNT(review_count >= 2 * 1.95) >= 2))
我是 Postgre 和 StackOverflow 的新手,所以如果您对我提出这个问题的方式有任何反馈,请随时告诉我! =)
更新:
感谢@Gordon Linoff的帮助,我找到了以下解决方案:
SELECT *
FROM us_businesses_monthly_growth_and_avg
WHERE business_id IN (SELECT distinct(business_id)
FROM (SELECT *,
lag(year) OVER (PARTITION BY business_id ORDER BY year, month) AS prev_year,
lag(month) OVER (PARTITION BY business_id ORDER BY year, month) AS prev_month,
lag(review_count) OVER (PARTITION BY business_id ORDER BY year, month) AS prev_review_count
FROM us_businesses_monthly_growth_and_avg
) AS usga
WHERE (city = 'Charlotte' AND review_count >= 4 * 1.95 AND prev_review_count >= 4 * 1.95 AND (YEAR * 12 + month) = (prev_year * 12 + prev_month) + 1)
OR (city = 'Las Vegas' AND review_count >= 4 * 3.31 AND prev_review_count >= 4 * 3.31 AND (YEAR * 12 + month) = (prev_year * 12 + prev_month) + 1);
【问题讨论】:
-
请不要使用不适用于您的问题的标签。
-
您希望它返回与符合条件的
business_id对应的所有行,还是只返回那些连续且拥有足够评论计数的行? -
是的,正确@toonice 我希望它返回 所有 对应于 business_id 的行
-
作为建议,如果您在发布问题时发布用于创建和填充示例表和示例数据的脚本(如果这些脚本可用或易于创建),那就太好了。虽然这并不总是需要或错过,但它确实有助于开发答案来测试他们的代码。
标签: sql postgresql