SQLite:在特定时间间隔内对数据进行分组

时间:2020-06-29 14:45:59

标签: sqlite android-sqlite

我有一个用于存储订单数据的表:

订单表:

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
.   | .
.   | .

我该怎么做?

2 个答案:

答案 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版本。

如果它确实支持它们,那么您要做的就是将CTELEFT联接到您的查询中:

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()