【发布时间】:2022-01-25 10:50:33
【问题描述】:
我正在做一个关于日期格式的 MODE.com SQL 练习题。
练习题是:编写一个查询,计算成立后 3 年、5 年和 10 年内收购的公司数量(在 3 个单独的列中)。包括一列收购的公司总数。按类别分组并限制为仅具有创建日期的行。
它使用两个表:
tutorial.crunchbase_companies_clean_date 表,包含所有公司的信息,如公司名称、成立年份等。
tutorial.crunchbase_acquisitions_clean_datetable,包含所有被收购公司的信息,如被收购公司名称、被收购日期等。
我的代码是:
SELECT companies.category_code,
COUNT(CASE WHEN acq.acquired_at_cleaned - companies.founded_at_clean:: timestamp <= '3 years' THEN 1 ELSE NULL END) AS less_than_3_years,
COUNT(CASE WHEN acq.acquired_at_cleaned - companies.founded_at_clean:: timestamp <= '5 years' THEN 1 ELSE NULL END) AS between_3_to_5_years,
COUNT(CASE WHEN acq.acquired_at_cleaned - companies.founded_at_clean:: timestamp <= '10 years' THEN 1 ELSE NULL END) AS within_10_years,
COUNT(1) AS total
FROM tutorial.crunchbase_companies_clean_date companies
JOIN tutorial.crunchbase_acquisitions_clean_date acq
ON companies.permalink = acq.company_permalink
WHERE companies.founded_at_clean IS NOT NULL
GROUP BY 1
ORDER BY total DESC
结果是: My result
答案查询是:
SELECT companies.category_code,
COUNT(CASE WHEN acquisitions.acquired_at_cleaned <= companies.founded_at_clean::timestamp + INTERVAL '3 years'
THEN 1 ELSE NULL END) AS acquired_3_yrs,
COUNT(CASE WHEN acquisitions.acquired_at_cleaned <= companies.founded_at_clean::timestamp + INTERVAL '5 years'
THEN 1 ELSE NULL END) AS acquired_5_yrs,
COUNT(CASE WHEN acquisitions.acquired_at_cleaned <= companies.founded_at_clean::timestamp + INTERVAL '10 years'
THEN 1 ELSE NULL END) AS acquired_10_yrs,
COUNT(1) AS total
FROM tutorial.crunchbase_companies_clean_date companies
JOIN tutorial.crunchbase_acquisitions_clean_date acquisitions
ON acquisitions.company_permalink = companies.permalink
WHERE founded_at_clean IS NOT NULL
GROUP BY 1
ORDER BY 5 DESC
结果是: The answer result
您可以在屏幕截图中看到结果非常相似,但有些数字不同。
我的查询和答案之间的唯一区别在于 COUNT 语句,但我并没有真正看到区别,例如:acq.acquired_at_cleaned - companies.founded_at_clean:: timestamp <= '3 years' 和 acquisitions.acquired_at_cleaned <= companies.founded_at_clean::timestamp + INTERVAL '3 years'
我尝试在我的 SELECT 语句中添加INTERVAL:
SELECT companies.category_code,
COUNT(CASE WHEN acq.acquired_at_cleaned - companies.founded_at_clean:: timestamp <= INTERVAL '3 years' THEN 1 ELSE NULL END) AS less_than_3_years,
COUNT(CASE WHEN acq.acquired_at_cleaned - companies.founded_at_clean:: timestamp <= INTERVAL '5 years' THEN 1 ELSE NULL END) AS between_3_to_5_years,
COUNT(CASE WHEN acq.acquired_at_cleaned - companies.founded_at_clean:: timestamp <= INTERVAL '10 years' THEN 1 ELSE NULL END) AS within_10_years,
COUNT(1) AS total
并从答案查询中删除INTERVAL:
SELECT companies.category_code,
COUNT(CASE WHEN acquisitions.acquired_at_cleaned <= companies.founded_at_clean::timestamp + '3 years'
THEN 1 ELSE NULL END) AS acquired_3_yrs,
COUNT(CASE WHEN acquisitions.acquired_at_cleaned <= companies.founded_at_clean::timestamp + '5 years'
THEN 1 ELSE NULL END) AS acquired_5_yrs,
COUNT(CASE WHEN acquisitions.acquired_at_cleaned <= companies.founded_at_clean::timestamp + '10 years'
THEN 1 ELSE NULL END) AS acquired_10_yrs,
COUNT(1) AS total
但结果是一样的。
我试图知道acquid_date和founded_date之间的差异的结果,看看该值是否可以与INTERVAL进行比较。结果是几天之内,这对我来说很有希望。
The result
我尽量提供所有信息供您考虑。希望有人能帮忙。提前谢谢!
【问题讨论】:
-
请不要在您的问题中使用链接。用所有相关信息更新它,最好是可编辑的文本
-
可能是您的数据库将
INTERVAL '3 years'视为一个区间,而不仅仅是'3 years',这会导致一些字符串比较。想想<=运算符两边的表达式类型。 -
@NickW 感谢您的建议。我编辑了我的问题。希望现在更清楚了
-
@JonArmstrong 我也尝试在我的查询中使用间隔,或者从答案查询中删除间隔,但结果是一样的。而且我还在比较中指定了时间戳,所以我认为不是字符串比较的问题。
-
一个测试用例会很有帮助。看来这两个查询之间的唯一区别是“INTERVAL”操作与可能的字符串比较。您能否包括(在问题中)对使用
INTERVAL的查询的调整?
标签: sql postgresql datetime case intervals