【问题标题】:Sqlite get a list of last 30 days, one row per daySqlite 获取最近 30 天的列表,每天一行
【发布时间】:2017-01-19 03:51:19
【问题描述】:

我将日期存储在一个 int 字段中,当我选择它时,我使用

strftime('%Y-%m-%d', table.date/1000, 'unixepoch') as date

我需要过去 30 天的数据用于图表目的,这意味着我需要在最终查询中包含以下内容:

2017-01-18 ,2

2017-01-17, 0

2017-01-16, 0

2017-01-15, 1

在我的表中,我只有 1 月 18 日和 15 日的行。因此,对它运行查询,只会返回存在日期的行,

2017-01-18 ,2

2017-01-15, 1

但是,作为最终结果,我需要在过去 30 天内将没有任何值的行的值设为 0。为了做到这一点,我需要一种方法将我的数据与返回的查询联合起来

现在-1 天,0

现在-2 天,0

现在-3 天,0 ....

过去 30 天。这样,当我结合这 2 个查询时,就会得到想要的结果。

使用来自https://stackoverflow.com/a/32987070/379865

我设法得到了数据

  WITH RECURSIVE dates(date) AS (
  VALUES(date('now'))
  UNION ALL
  SELECT date(date, '-1 day')
  FROM dates
  limit 30
)
SELECT date, 0 as value FROM dates;

但是我不知道如何将它与我的其他查询联合起来,因为 WITH 似乎不是联合所有的一部分

【问题讨论】:

    标签: android sqlite android-sqlite


    【解决方案1】:

    我不完全确定你在追求什么,但我会试一试。

    strftime('%Y-%m-%d', table.date/1000, 'unixepoch') 汇总,然后进行计数。

    例如

    SELECT COUNT(*), strftime('%Y-%m-%d', table.date/1000, 'unixepoch') as date FROM table GROUP BY strftime('%Y-%m-%d', table.date/1000, 'unixepoch')
    

    希望这就是你要找的......

    【讨论】:

    • 对不起,我没有解释得太清楚。我已经编辑了问题
    • 我再次更新了我的问题。现在我可以随心所欲地获取日期,但不知道如何加入其他数据
    【解决方案2】:

    WITH 确实适用于复合查询:

    WITH ...
    SELECT date, 0 AS value FROM dates
    UNION ALL
    SELECT ...;
    

    但是,要删除存在日期的虚拟行,您应该使用连接:

    WITH ...
    SELECT ...
    FROM dates
    LEFT JOIN (SELECT ...your actual query...)
    USING (date);
    

    【讨论】:

    • 非常有趣。因为我并没有真正得到 LEFT JOIN 的东西,所以我有一个 UNION ALL,然后将所有内容包装在一个大选择中,其中包含按日期分组和价值总和。
    猜你喜欢
    • 1970-01-01
    • 2016-08-20
    • 2021-10-28
    • 2017-07-18
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多