日期之间的SQLite差异占组的百分比

时间:2018-01-13 11:25:10

标签: sql sqlite date

我有下表:

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%。

2 个答案:

答案 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                 |