我有一个用于存储订单数据的表:
订单表:
id | order_time | quantity | ...
1 | 1592821854318 | 2
2 | 1592901538199 | 4
3 | 1592966454547 | 1
4 | 1593081282406 | 9
5 | 1593141826330 | 6
order_time表是UNIX时间戳。
使用下面的查询,我可以获得按天分组的可用数据(86400000 = 24小时):
SELECT order_time+ (86400000 - (order_time % 86400000)) as gap, SUM(quantity) as
totalOrdersBetweenInterval
FROM USAGE_DETAILS ud
WHERE order_time >= 1590969600 AND order_time <= 1593388799000
GROUP BY gap
ORDER BY gap ASC
假设对于这个月的6月,我在1、4、6、7日期收到订单,那么通过使用上面的查询,我可以按以下方式检索数据:
gap | totalOrdersBetweenInterval
1 | 5
4 | 6
6 | 4
7 | 10
我会在间隔列中收到UNIX时间戳,但是为了举例说明,我使用了可读的日期。
以上查询将仅检索已收到订单的日期的数据,但我想在以下范围内拆分数据,其中还包括无订单的日期:
gap | totalOrdersBetweenInterval
1 | 5
2 | 0
3 | 0
4 | 6
5 | 0
6 | 4
7 | 10
8 | 0
9 | 0
. | .
. | .
我该怎么做?
答案 0 :(得分:0)
您需要一个查询,该查询在6月的一天返回30行:1,2,...,30。
您可以使用递归CTE
:
with days as (
select 1 day
union all
select day + 1
from days
where day < 30
)
但是我不确定Android是否使用支持CTE
s的SQLite版本。
如果它确实支持它们,那么您要做的就是将CTE
与LEFT
联接到您的查询中:
with
days as (
select 1 day
union all
select day + 1
from days
where day < 30
),
yourquery as (
<your query here>
)
select d.day, coalesce(t.totalOrdersBetweenInterval, 0) totalOrdersBetweenInterval
from days d left join yourquery t
on t.gap = d.day
如果Android不支持CTE
,则必须构建返回带有UNION ALL
的日期的查询:
select d.day, coalesce(t.totalOrdersBetweenInterval, 0) totalOrdersBetweenInterval
from (
select 1 day union all select 2 union all
select 3 union all select 4 union all
......................................
select 29 union all select 30
) d left join (
<your query here>
) t
on t.gap = d.day
答案 1 :(得分:0)
感谢@forpas帮助我。 只是发布,以防有人正在按unix时间间隔搜索切片数据。
Base.f()