【问题标题】:SQLite difference between dates as a percentage of group日期之间的 SQLite 差异占组的百分比
【发布时间】:2018-01-13 11:25:10
【问题描述】:

我有下表:

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

【问题讨论】:

  • 我不明白你的比率/逻辑。 B 组只有一条记录,所以它的比率必须是 0 或 1。
  • 已编辑问题以使其更清晰。
  • 由于闰年,这可能会很棘手。

标签: sql sqlite date


【解决方案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"

【讨论】:

  • 我正在考虑确保 date1 date2 然后使用 CASE WHEN datetime(date2) &lt;= datetime(date1, '+1 year') THEN 1 ELSE 0 END,但是是的,这个。
  • @LordThompson 感谢您的反馈。
【解决方案2】:

@Tim 的回答略有不同:

您的示例表有 date1 date2 的情况,所以让我们从查询开始以确保 date1

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                 |

【讨论】:

  • 实际上,我认为您的答案更好的是您使用datetime 函数和+1 year 来解决闰年问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-30
  • 1970-01-01
  • 2019-07-19
  • 2010-09-22
  • 1970-01-01
相关资源
最近更新 更多