我需要计算一下,如果一个成员有90%的总成本在3个月的时间(可以是任何3个月的时间,不是连续的)在他们的全年.

MemberID    MonthYearofDateofService  TotalCost 
 1              Jan2023                  100
 1              Feb2023                  100
 1              Mar2023                  1000
 1              Apr2023                  100
 1              May2023                  200
 1              Jun2023                  100
 1              Jul2023                  5000
 1              Aug2023                  300
 1              Sep2023                  330
 1              Oct2023                   50
 1              Nov2023                    0
 1              Dec2023                  100

我试着使用窗口函数SUM,但我只能连续几个月才能弄明白.我认为可能涉及循环或递归函数来解决这一问题.

推荐答案

您可以在SQL中组合使用窗口函数和子查询.

WITH ThreeMonthPeriods AS (
    SELECT DISTINCT MonthYearofDateofService,NEWID() AS T
    FROM YourTableName
    ORDER BY NEWID()
    OFFSET 0 ROWS FETCH NEXT 3 ROWS ONLY
)
, RecursiveCTE AS (
    SELECT
        MemberID,
        MonthYearofDateofService,
        TotalCost,
        CAST(TotalCost AS DECIMAL(10, 2)) AS RunningTotal, -- Adjusted the data type
        1 AS MonthCount
    FROM
        YourTableName
    WHERE
        MonthYearofDateofService IN (SELECT MonthYearofDateofService FROM ThreeMonthPeriods)
    UNION ALL
    SELECT
        t.MemberID,
        t.MonthYearofDateofService,
        t.TotalCost,
        CAST(t.TotalCost + r.RunningTotal AS DECIMAL(10, 2)), -- Adjusted the data type
        r.MonthCount + 1
    FROM
        YourTableName t
    INNER JOIN
        RecursiveCTE r ON r.MemberID = t.MemberID
                       AND r.MonthYearofDateofService < t.MonthYearofDateofService
    WHERE
        r.MonthCount < 3
)
SELECT
    MemberID
FROM
    RecursiveCTE
WHERE
    RunningTotal >= 0.09 * (SELECT SUM(TotalCost) FROM YourTableName WHERE MemberID = RecursiveCTE.MemberID)
GROUP BY
    MemberID
HAVING
    COUNT(*) <= 3;

Sql相关问答推荐

使用group by后我的平均输出不是我想要的

如何实现一个广泛的多级自连接PostgreSQL查询?

用于动态查询情况的存储过程常识模式

冲突查询的UPDATE时违反非空约束

Oracle分层查询-两条路径在末尾合并为一条

使用SQL数据库中的现有列派生或修改几个列

需要从键-值对数据中提取值

WooCommerce产品的SQL查询:获取sku和产品标签

用另一个表中的特定名称替换 SQL 查询中的 ID.但我的两个表都有多个列

聚合内部的条件在哪里?

如何解释 SQL Server 中的 Foxpro 语法?

识别SQL Server中的重复数字

在SQL中实现表格数据透视类型报表

为重复的项目编号显示正在处理

Clob 问题 - 将 clob 列拆分为多行

joins 组合多个重复数据删除策略

String_Split 多列

如何筛选 GROUP BY 结果? HAVING 没有产生预期的结果

使用 JSON_BUILD_OBJ 从 Postgres 返回 JSON

BigQuery 将一行拆分为多列