我有如下表格中的数据:

Account Id Amount Start_date End_date
123 10 2023-11-16 17:00:00 2023-11-16 18:00:00
123 10 2023-11-16 02:00:00 2023-11-17 02:00:00
123 20 2023-11-17 17:00:00 2023-11-17 18:00:00
123 30 2023-11-18 02:00:00 2023-11-20 02:00:00
123 10 2023-11-18 17:00:00 2023-11-18 18:00:00
123 20 2023-11-19 02:00:00 2023-11-20 02:00:00

我需要计算一个Cloud ID每天的金额. 例如,对于云ID 123,在第一行中,开始日期和结束日期的间隔为1,因此日期2023-11-16将包含10.第二行,开始日期和第二天之间的差值为2,因此10的金额将在16日的日期计算为10/2(差值),即2,在17日的日期计算为10/2 = 5.

11-16 10+5 = 15
11-17 5+20 = 25
11-18 10+10= 20
11-19 10+10= 20

我需要编写一个查询来以上述方式获得结果.

到目前为止,我已经try 了以下查询,但遇到语法错误-

select start_date, end_date, account_id, amount, datediff(day, start_date, end_date) as interval into #temp 
from billing where account_id = '123';

select * from #temp;
drop table if exists #result;
select account_id, start_date, end_date, interval, 
  CASE WHEN interval = 0 THEN amount ELSE amount/(interval + 1) END AS per_day_cost
INTO #result
UNION ALL
SELECT  account_id, start_date, end_date, interval, 
  CASE WHEN interval = 0 THEN amount ELSE amount/(interval + 1) END AS per_day_cost
FROM (VALUES (1), (2), (3)) as v(n) CROSS JOIN
  (SELECT account_id, start_date, end_date, interval, amount FROM #temp) s
where v.n <= interval
order by account_id;

select * from #result;

推荐答案

最后,我为我的问题写了以下查询-

WITH toolsdatastats AS  --gets the min and max date among all records
    (
        SELECT trunc(min(start_date)) earliestdate,  trunc(max(end_date)) latestdate
        FROM billing
    ),
    dates AS  --gets the full date from system between the min and max dates found earlier
    (
        SELECT *
        FROM date_d
        WHERE fulldate >= (SELECT earliestdate FROM toolsdatastats)
            AND fulldate <= (SELECT latestdate FROM toolsdatastats)
    ),
    dailydata AS
    (
        SELECT fulldate full_date, account_id, amount, start_date, end_date,
            CASE
                WHEN td.start_date < dates.fulldate
                    THEN dates.fulldate
                ELSE td.start_date
            END AS usage_start_for_the_day,
            CASE
                WHEN td.end_date > DATEADD(day, 1, dates.fulldate)
                    THEN DATEADD(day, 1, dates.fulldate)
                ELSE td.end_date
            END AS usage_end_for_the_day
        FROM billing td
        JOIN dates on dates.fulldate>=trunc(td.start_date) and dates.fulldate<=trunc(td.end_date)
        ORDER BY account_id, fulldate
    ),
    dailycost as 
    (
      select full_date, account_id, usage_start_for_the_day, usage_end_for_the_day, start_date, end_date,
        CASE 
          WHEN (full_date = trunc(start_date) and trunc(usage_start_for_the_day) = trunc(usage_end_for_the_day))
          THEN amount
          ELSE amount/(datediff(day, start_date, end_date) + 1) 
        END AS amount
        from dailydata
    )
    select full_date, account_id, sum (amount) from dailycost group by full_date, account_id order by full_date;

Sql相关问答推荐

获取每个帖子的匹配关键字列表

从列的不同值创建列

如何从多行数据中获取一行合并数据?

Oracle SQL-将结果列在单行中

对任何(数组)使用LIKE?

编写一个SQL查询来返回收视率较高的类型,并取这些收视率的平均值,我该如何做呢?

将Dense_RANK列为聚合(非解析)函数(&A)

如果多行科目有一行在指定的日期范围内,如何 Select 该科目在该日期之前的所有行?

将所有XML文件导入到SQL Server中

如何使用SQL Server中的Nodes()方法执行与OPENXML相同的操作

每小时 Select 1行

违反了完整性约束-值存在时找不到父键

PostgreSQL中递归CTE查询的故障过滤

在 PostgreSQL 中使用 ltree 列进行累积

POSTGRES to_timestamp() 假定 UTC 字符串为本地时间

在 SQL Server 中查找重复项

将一名成员金额分配给群组内的其他成员

PostgreSQL 中将数据从 JSONB 类型转换为 Array 类型

Django only() 和 values() 不适用于 prefetch_related()

如何在 PL/SQL 中区分返回的 XML 值?