Sql 本年度和上一年度每周运行总计

Sql 本年度和上一年度每周运行总计,sql,postgresql,pgadmin,postgresql-9.6,Sql,Postgresql,Pgadmin,Postgresql 9.6,此查询提供了当前年份和上一年至今的价格和平方英尺的年至今数字。这更像是本年度和上一年度的运行总数,在本例中是从1到7周,依此类推。。。。。2017年第7周于2017年2月19日结束,前一年2016年第7周于2016年2月22日结束。我之所以使用子查询,是因为这是我知道的避免这种情况的唯一方法。当然,如果您认为执行此查询有一个更短、可行的替代方案,请给出建议 实际销售日期保存了一周中所有七天的数据,但我们在周日截止,这就是为什么2016年2月22日周日结束2016年第7周,2017年2月19日周日

此查询提供了当前年份和上一年至今的价格和平方英尺的年至今数字。这更像是本年度和上一年度的运行总数,在本例中是从1到7周,依此类推。。。。。2017年第7周于2017年2月19日结束,前一年2016年第7周于2016年2月22日结束。我之所以使用子查询,是因为这是我知道的避免这种情况的唯一方法。当然,如果您认为执行此查询有一个更短、可行的替代方案,请给出建议

实际销售日期保存了一周中所有七天的数据,但我们在周日截止,这就是为什么2016年2月22日周日结束2016年第7周,2017年2月19日周日结束2017年第7周

我尝试了Actual\u Sale\u Date=Date\u trunc'week',now::Date-1此函数只返回在过去的星期天结束的前一周数据。我看了一下interval,因为dateadd在postgresql中不存在,但无法使用它

我的问题是:

select (money(Sum("Price") / COUNT("Price"))) as "Avg_Value YTD",
Round(Avg("Price"/"Sq_Ft"),+2) as "Avg_PPSF YTD",

(select 
(money(Sum("Price") / COUNT("Price")))  from allsalesdata
where "Actual_Sale_Date" >=  '01/01/2016' AND "Actual_Sale_Date" < '02/22/2016'
and "Work_ID" = 'SO') AS "Last Year at this time Avg_Value", 


(select Round(Avg("Price"/"Sq_Ft"),+2)
from allsalesdata
where "Actual_Sale_Date" >=  '01/01/2016' AND "Actual_Sale_Date" <  '02/22/2016' 
and "Work_ID" = 'SO') AS "Last Year at this time Avg_PPSF"


from allsalesdata
where "Actual_Sale_Date" >=  '01/01/2017' AND "Actual_Sale_Date" <'02/20/2017'
and "Work_ID" = 'SO'

假设您有一个最新版本的PG,这应该是您需要的:

SELECT DISTINCT wk AS "Week",
       sum("Price")::money FILTER (WHERE yr = 2017) OVER w / 
       count("Price") FILTER (WHERE yr = 2017) OVER w AS "Avg_Value YTD",
       sum("Price")::money FILTER (WHERE yr = 2017) OVER w / 
       sum("Sq_Ft") FILTER (WHERE yr = 2017) OVER w AS "Avg_PPSF YTD",
       sum("Price")::money FILTER (WHERE yr = 2016) OVER w / 
       count("Price") FILTER (WHERE yr = 2016) OVER w AS "Last Year this time Avg_Value",
       sum("Price")::money FILTER (WHERE yr = 2016) OVER w / 
       sum("Sq_Ft") FILTER (WHERE yr = 2016) OVER w AS "Last Year this time Avg_PPSF",
FROM (
    SELECT extract(isoyear from "Actual_Sale_Date")::integer AS yr,
           extract(week from "Actual_Sale_Date")::integer AS wk,
           "Price", "Sq_Ft"
    FROM allsalesdata
    WHERE "Work_ID" = 'SO') sub
-- optional, show only completed weeks in this year:
WHERE wk <= extract(week from CURRENT_DATE)::integer - 1 
WINDOW w AS (ORDER BY wk)
ORDER BY wk;
在内部查询中,将为每次销售提取销售日期的年份和星期。根据您的要求,本周从周一开始


在主查询中,这些行作为单个分区帧处理,即从分区的开始=第一行到当前行的最后一个对等行。由于窗口定义按周对行进行排序,因此从开始周=1到当前周的所有行都包含在摘要中。这将为您提供运行总数。sum和count函数按年份过滤,DISTINCT子句可确保每周只获得一行。

是否需要按周生成日期序列?查询有周序列要求。随着一年的进展,运行列的总数。很抱歉,我不清楚每周的累计总数?例如,2016年第1周总计2017年第1周总计?是的,你可以这么说。例如,Actual_Sale_Date=Date_trunc'week',now::Date-1此函数仅返回在过去的星期日结束的前一周数据。我看了一下interval,因为dateadd在postgresql中不存在,但无法使用它。例如,2016年第1周总计2017年第1周总计?是的,但是在进入3月、四月等等时,我正在运行PostgreSQL。C++ 6BETA3,由Visual C++ 1800构建,64位。谢谢帕特里克,它很好,但是你知道为什么它显示第八周的数据,即使我们仍然在2017周的第八周。是不是应该等到本周的星期日还是下周的星期一?@JakeWagner:这个查询显示从年初到当前(含年初)这几周的数据。本周是第8周。如果您只需要整周,可以修改WHERE子句并减去1:WHERE wk
SELECT DISTINCT wk AS "Week",
       sum("Price")::money FILTER (WHERE yr = 2017) OVER w / 
       count("Price") FILTER (WHERE yr = 2017) OVER w AS "Avg_Value YTD",
       sum("Price")::money FILTER (WHERE yr = 2017) OVER w / 
       sum("Sq_Ft") FILTER (WHERE yr = 2017) OVER w AS "Avg_PPSF YTD",
       sum("Price")::money FILTER (WHERE yr = 2016) OVER w / 
       count("Price") FILTER (WHERE yr = 2016) OVER w AS "Last Year this time Avg_Value",
       sum("Price")::money FILTER (WHERE yr = 2016) OVER w / 
       sum("Sq_Ft") FILTER (WHERE yr = 2016) OVER w AS "Last Year this time Avg_PPSF",
FROM (
    SELECT extract(isoyear from "Actual_Sale_Date")::integer AS yr,
           extract(week from "Actual_Sale_Date")::integer AS wk,
           "Price", "Sq_Ft"
    FROM allsalesdata
    WHERE "Work_ID" = 'SO') sub
-- optional, show only completed weeks in this year:
WHERE wk <= extract(week from CURRENT_DATE)::integer - 1 
WINDOW w AS (ORDER BY wk)
ORDER BY wk;