Sqlite获取最近30天的列表,每天一行

时间:2017-01-18 17:03:24

标签: android sqlite android-sqlite

我将日期存储在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似乎并不是所有联盟的一部分

2 个答案:

答案 0 :(得分:0)

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

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

e.g。

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

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

答案 1 :(得分:0)

WITH确实使用复合查询:

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

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

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