如何在postgres中查询过去四个星期的每周总和

How to query a sum of every week for the last four weeks in postgres

简单地说,我有一个 table 的交易看起来像这样

我试图在过去 7 天(day by day)、过去 4 周(week by week)和过去 12 个月(month by month)之前查询此 table。

我打算用 javascript 获取日期,逐笔查询交易,然后对外部的每个(周、日、月)求和,然后创建一个数组来保存这些值。但我的直觉告诉我,可以通过 postgres 数据库查询获得其中的大部分内容。

所以我的问题是,是否可能,如果是的话如何。

这是我在尝试获取日期

const today = new Date();
const firstWeekEnd = new Date(today);
const secondWeekStart = new Date(today);
const secondWeekEnd = new Date(today);
const thirdWeekStart = new Date(today);
const thirdWeekEnd = new Date(today);
const fourthWeekStart = new Date(today);
const fourthWeekEnd = new Date(today);

function formatDate(date) {
  let dd = date.getDate();
  let mm = date.getMonth() + 1;
  const yyyy = date.getFullYear();
  if (dd < 10) { dd = `0${dd}`; }
  if (mm < 10) { mm = `0${mm}`; }
  date = `${yyyy} ${mm}= ${dd}`;
  return date;
}

firstWeekEnd.setDate(firstWeekEnd.getDate() - 6);
secondWeekStart.setDate(secondWeekStart.getDate() - 7);
secondWeekEnd.setDate(secondWeekEnd.getDate() - 13);
thirdWeekStart.setDate(thirdWeekStart.getDate() - 14);
thirdWeekEnd.setDate(thirdWeekEnd.getDate() - 20);
fourthWeekStart.setDate(fourthWeekStart.getDate() - 21);
fourthWeekEnd.setDate(fourthWeekEnd.getDate() - 27);

我正在使用 nodejs 和 sequelize

非常感谢任何帮助或想法

如果您正在寻找 PostgreSQL 中的某个功能来帮助您对数据进行分组,那么我可以为您提供肯定的答案 date_trunc('week', createdAt )。它 returns 是一周中的第一天,您可以按这样对数据进行分组:

SELECT date_trunc('week', createdAt ) as start_of_week, sum(transactionTotal)
FROM <your_table_name_here>
GROUP BY date_trunc('week', createdAt )
ORDER BY date_trunc('week', createdAt )

从 Sequelize.js 开始,您应该使用原始查询来执行这样的 SQL-query。

您可以创建一个 CTE,它会生成一个名称和一个带有时区范围的时间戳 (tstzrange ). Then join that CTE to your table with the element contained by operator. Finally, use the SUM function for those falling into particular ranges. See example here

with date_ranges (range_name, range_dates) as
     ( values ('week_0', tstzrange ((now()-interval '6 days'),  now(),'[]'))
            , ('week_1', tstzrange ((now()-interval '13 days'), (now()-interval '7 days'), '[]'))
            , ('week_2', tstzrange ((now()-interval '20 days'), (now()-interval '14 days'),'[]'))
            , ('week_3', tstzrange ((now()-interval '27 days'), (now()-interval '21 days'),'[]')) 
     ) 
select range_name, range_dates, sum(amount) total_amount 
  from mytable      mt
  join date_ranges  dr
    on (mt.created_at <@ range_dates)
 group by range_name, range_dates
 order by range_name;