Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 使用postgres计算每月经常性收入(MRR)结果_Json_Postgresql - Fatal编程技术网

Json 使用postgres计算每月经常性收入(MRR)结果

Json 使用postgres计算每月经常性收入(MRR)结果,json,postgresql,Json,Postgresql,我需要使用postgresql json计算所选两个日期之间的MRR,如中所述,我的订阅也有间隔,如“1天”、“15天”、“2周”、“X周”、“X月”、“X年”,其中X可以是任何数字 我有以下订阅架构和值: CREATE TABLE subscriptions ( id bigserial NOT NULL, data json, created_date date, updated_date date, user_id bigserial NOT NULL, CONST

我需要使用postgresql json计算所选两个日期之间的MRR,如
中所述,我的订阅也有间隔,如
“1天”、“15天”、“2周”、“X周”、“X月”、“X年”,其中X可以是任何数字

我有以下订阅架构和值:

CREATE TABLE subscriptions
(
  id bigserial NOT NULL,
  data json,
  created_date date,
  updated_date date,
  user_id bigserial NOT NULL,
  CONSTRAINT subscription_id_pk PRIMARY KEY (id)
)
数据位于json格式的“数据”列中,如:

{
  "id": "1",
  "amount": 3900,
  "interval": "1 WEEK",
  "created": 1424011935
}
{
  "id": "1",
  "amount": 3900,
  "subscription_id": "1"
  "created": 1424011935

}
和事务,在每个定期订阅成功时创建。我认为交易是不需要的,但如果你能用这个开发,那也很好

CREATE TABLE transactions
(
  id bigserial NOT NULL,
  data json,
  created_date date,
  updated_date date,
  user_id bigserial NOT NULL,
  CONSTRAINT transactions_id_pk PRIMARY KEY (id)
)
数据位于json格式的“数据”列中,如:

{
  "id": "1",
  "amount": 3900,
  "interval": "1 WEEK",
  "created": 1424011935
}
{
  "id": "1",
  "amount": 3900,
  "subscription_id": "1"
  "created": 1424011935

}
您可以使用从数据json创建的unix时间戳或从表中创建的日期,无论哪一个更适合您

  • 此处订阅创建日期是首次创建订阅,而不是每次重复创建

  • 我有9.3版


非常简单,
generate_series
可以与
INTERVAL
s一起使用,我们可以使用
横向连接
为每个json行生成数据

WITH j AS(
SELECT '{
  "id": "1",
  "amount": 3900,
  "interval": "1 WEEK",
  "created": 1424011935
}'::json AS data
UNION ALL
SELECT '{
  "id": "2",
  "amount": 100,
  "interval": "23.5 DAY",
  "created": 552614400
}'::json
),
dates AS(
SELECT
'2008-03-01 00:00'::timestamp AS start
,'2015-03-08 07:00'::timestamp AS stop
)
SELECT j.data->>'id'
    ,sum((j.data->>'amount')::int)
    ,count(*) as intervals
FROM j
CROSS JOIN dates
CROSS JOIN LATERAL
    (SELECT i
    FROM generate_series(to_timestamp((j.data->>'created')::int), dates.stop + (j.data->>'interval')::interval,(j.data->>'interval')::interval) as i
    WHERE i BETWEEN dates.start AND dates.stop
    ) AS q
GROUP BY j.data->>'id'
上面给出的结果是:

 id |  sum  | intervals
----+-------+-----------
 1  | 11700 |         3
 2  | 11000 |       110

委托和交易之间的关系是什么?还有,到目前为止你试过什么吗?@JakubKania抱歉,忘记添加交易细节了,我已经添加了。我认为仅计算订阅表就足够了。我尝试开发,但无法生成重复出现在下标中的间隔计算。第一个结果可以解释,它只显示间隔3,但是2008年到2015年之间的周数太多了,我希望结果如下:假设我有一个日期:2010-12-01到2015-03-01意味着一些订阅可能早于2010-12-01开始,假设一个订阅在2008-12-02开始,所以它应该反映在每个月的2010-12-01到2015-03-01,我需要按每个月或日期分组,如果它是一年,它应该是YealAmount/12 pM,其他的也一样。请查看参考链接了解更多信息details@mukund它是3,因为第一条记录创建的时间戳是2月15日。按日期分组是一个众所周知的问题,在其他问题中已经得到了回答。例如: