2017-02-23 101 views
1

此查詢提供當前和今年前一年的價格和平方英尺的年迄今數字。這更像是本年和前一年的跑步總數,就本例中的週數而言,從1到7等等......(2017年第7周2017年2月19日結束)當年和前一年(2016年第7周結束於2016年2月22日)。我之所以使用子查詢,是因爲這是只有我知道的方式來解決這種情況。當然,如果你認爲執行這個查詢有一個更短的,可行的選擇,請諮詢。以周爲單位的當前和上一年運行總計

Actual_Sale_Date持有一週中所有七天的數據,但我們在週日中斷,這就是爲什麼2016年2月22日(2016年第7週週末)和2017年2月19日(週日結束第7周) 2017年)。

我試過"Actual_Sale_Date" = date_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' 

樣本數據:

Price  Sq_Ft  Actual_Sale_Date  Work_ID 

45871  3583   01/15/2016    SO 
55874  4457   02/05/2016    SO 
88745  4788   02/20/2016    SO 
58745  1459   01/10/2016    SO 
88749  2145   01/25/2017    SO 
74856  1478   01/25/2017    SO 
74586  4587   01/31/2017    ABC 
74745  1142   02/10/2017    SO 
74589  2214   02/19/2017    SO 
+0

您是否需要按周生成日期系列? – McNets

+0

該查詢具有「周」系列要求。隨着年份的推進,總共運行這些列。 –

+0

對不起,但我不清楚,按星期累計總數? – McNets

回答

2

這應該是你所需要的(假設你有最近的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; 

在每個銷售都會提取銷售日期的年和周內部查詢。根據您的要求,星期一從星期一開始。

在主查詢這些行被處理爲一個單一分區,即,從分區(=第一行)的開始到當前行的最後同行。由於窗口定義按wk排序行,所以從開始(周= 1)到當前星期的所有行都包含在彙總中。這會給你總分。 sum()count()函數根據有問題的年份過濾,並使用DISTINCT子句確保您每週只能獲得一行。

+0

我使用PostgreSQL 9.6beta3,由Visual C++ build 1800,64位編譯。 –

+0

感謝帕特里克,它效果很好,但是你知道它爲什麼顯示第八週的數據,即使我們仍然在2017年的第八週。是否應該等到本週的星期天或下週的星期一? –

+0

@JakeWagner:此查詢顯示從年初到現在的一週(含)的數據。本週是第8周。 –

相關問題