我有下表:
group - date1 - date2
A - 2014- 04-04 09:20:04.903 - 2015-05-04 09:20:04.903
A - 2015- 04-04 09:20:04.903 - 2015-03-04 09:20:04.903
B - 2016- 04-04 09:20:04.903 - None
B - 2016- 07-04 09:20:04.903 - 2015-07-04 09:20:04.903
如何计算日期相差一年或更少的次数与每组的总条目数之比? date2可以是none,但date1不是。例如,A组和B组都是50%,因为一个条目相差不到一年,所以这个比例是1/2。
这是因为,第一个条目相差超过一年,第二个条目相差较少,第三个条目缺少date2(因此计入超过一年),第四个条目恰好是一年。所以两组的比例都是50%。
答案 0 :(得分:1)
我们可以在组中使用条件聚合,检查时间戳之间的天数是否在一年之内。我在下面的查询中做了两个假设。一个是如果缺少一个(或两个)日期,我将该记录视为匹配。另一个是我用365天代表一年。这在技术上是不正确的;闰年有一天(有时是额外的一天)。
SELECT
"group",
100.0 *
SUM(CASE WHEN COALESCE(ABS(julianday(date1) - julianday(date2)), 0) <= 365
THEN 1 ELSE 0 END) / COUNT(*) AS ratio
FROM yourTable
GROUP BY "group"
答案 1 :(得分:1)
@Tim的答案稍有不同:
您的样本表中包含date1&lt; date2和date1&gt; date2所以让我们从查询开始,以确保date1&lt; = date2:
SELECT "group", date1, date2
FROM table1
WHERE date1 <= date2 OR date2 IS NULL
UNION ALL
SELECT "group", date2, date1
FROM table1
WHERE date1 > date2
group |date1 |date2 |
------|------------------------|------------------------|
A |2014-04-04 09:20:04.903 |2015-05-04 09:20:04.903 |
B |2016-04-04 09:20:04.903 | |
A |2015-03-04 09:20:04.903 |2015-04-04 09:20:04.903 |
B |2015-07-04 09:20:04.903 |2016-07-04 09:20:04.903 |
现在我们可以根据条件计算行数
SELECT
"group",
100.0 * SUM(CASE WHEN datetime(date2) <= datetime(date1, '+1 year') THEN 1 ELSE 0 END) / COUNT(*) AS percent_year_or_less
FROM
(
SELECT "group", date1, date2
FROM table1
WHERE date1 <= date2 OR date2 IS NULL
UNION ALL
SELECT "group", date2, date1
FROM table1
WHERE date1 > date2
)
GROUP BY "group"
group |percent_year_or_less |
------|---------------------|
A |50.0 |
B |50.0 |