发票数据库包含发票日期:
create table dok (
dokumnr serial primary key,
invoicedate date not null
);
仪表板需要逗号分隔的列表,其中包含过去 12 周的发票数量,eq
4,8,0,6,7,6,0,6,0,4,5,6
列表始终包含 12 个元素。如果在 7 天的时间间隔内没有发票,则应显示 0。每个元素都应包含 7 天的发票数量。
查询应该找到当前日期之前的最大日期:
select max(invoicedate) as last_date from dok;
之后可能使用 count(*) 和 string_agg() 创建列表。
最后(第 12 个)元素应包含发票数量
last_date .. last_date-interval'6days'
11 元素(前一个)应包含天数的发票
last_date-interval'7days' .. last_date-interval'14days'
等等
如何在 Postgres 9.1+ 中编写此查询?这是 ASP.NET MVC3 C# 应用程序,如果有帮助,查询的某些部分也可以在 C# 代码中完成。
我结束了
with list as (
SELECT count(d.invoicedate) as cnt
FROM (
SELECT max(invoicedate) AS last_date
FROM dok
WHERE invoicedate< current_date
) l
CROSS JOIN generate_series(0, 11*7, 7) AS g(days)
LEFT JOIN dok d ON d.invoicedate> l.last_date - g.days - 7
AND d.invoicedate<= l.last_date - g.days
GROUP BY g.days
ORDER BY g.days desc
)
SELECT string_agg( cnt::text,',')
from list