sql - 用 SQL 计算每天

标签 sql sqlite aggregate

我有一个像这样的sql表:

Id    Date     Price
1  21.09.09     25
2  31.08.09     16
1  23.09.09     21
2  03.09.09     12

所以我需要的是获取每个 id 的最小和最大日期以及它们之间的天数差异。这很容易。使用 SQLlite 语法:

  SELECT id, 
         min(date), 
         max(date), 
         julianday(max(date)) - julianday(min(date)) as dif 
  from table group by id

然后是棘手的问题:我怎样才能收到这个差异期间每天的价格。我的意思是这样的:

ID Date      PricePerDay
1  21.09.09      25
1  22.09.09       0
1  23.09.09      21
2  31.08.09      16
2  01.09.09       0
2  02.09.09       0
2  03.09.09      12

我按照您提到的日历创建了一个 cte,但不知道如何获得所需的结果:

WITH RECURSIVE
cnt(x) AS (
 SELECT 0
 UNION ALL
 SELECT x+1 FROM cnt
  LIMIT (SELECT ((julianday('2015-12-31') - julianday('2015-01-01')) + 1)))
SELECT date(julianday('2015-01-01'), '+' || x || ' days') as date FROM cnt

附:如果它采用 sqllite 语法,那就太棒了!

最佳答案

您可以使用递归 CTE 来计算最小日期和最大日期之间的所有天数。剩下的只是一个左连接和一些逻辑:

with recursive cte as (
      select t.id, min(date) as thedate, max(date) as maxdate
      from t
      group by id
      union all
      select cte.id, date(thedate, '+1 day') as thedate, cte.maxdate
      from cte
      where cte.thedate < cte.maxdate
     )
select cte.id, cte.date,
       coalesce(t.price, 0) as PricePerDay
from cte left join 
     t
     on cte.id = t.id and cte.thedate = t.date;

关于sql - 用 SQL 计算每天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39545063/

相关文章:

sql - ODCIAggregateMerge 没有 parallel_enabled

sql - 如何创建一个有效的查询来按特定时间间隔计算记录?

java - 如何在 Android Studio 上检索 SQL 数据库中的元素?

sql - 如何限制要在Sqlite3中存储的行数?

python-3.x - Pandas groupby,聚合字符串变量并向上移动空单元格

mysql - 按月汇总金额列 - sql

sql - Kibana-在可视化中连接多种类型的数据

sql - Postgres 9.x 中 CHECK 约束的成本是多少?

SQL 查询显示多次而不是一次

ios - 如何通过 FMDB 将数据保存和检索到 sqlite