我有一組變數賦值,如下所示,我需要以某種方式概括。
bar1Q19:exec sum Quantity from table where date within (2019.01.01,2019.03.31)
bar2Q19:exec sum Quantity from table where date within (2019.04.01,2019.06.30)
...
bar3Q21:exec sum Quantity from table where date within (2021.07.01,2021.06.30)
bar4Q21:exec sum Quantity from table where date within (2021.10.01,2021.12.31)
我正在撰寫一個最終將無人監督的腳本,并且在每個季度末只需要為過去 8 個季度分配這些變數。我對 KDB /Q 很陌生,所以不得不使用 over 和 scan 而不是回圈對我來說很困惑。
我在結構上認為,做一個 if 陳述句來檢查當前月份(我有一個變數)在哪個季度可能是有意義的,然后使用回圈從那個季度開始向后作業,但對我來說描述起來要容易得多來實際執行。任何關于如何開始的想法將不勝感激!
uj5u.com熱心網友回復:
要查找過去 8 個季度的相關日期,您可以使用此功能:
q){reverse("d"$(-3*til y) m),'-1 "d"$(-3*-1 til y) m:3 xbar"m"$x}[.z.d;8]
2020.01.01 2020.03.31
2020.04.01 2020.06.30
2020.07.01 2020.09.30
2020.10.01 2020.12.31
2021.01.01 2021.03.31
2021.04.01 2021.06.30
2021.07.01 2021.09.30
2021.10.01 2021.12.31
哪里x是當前日期,y是您要查找的四分之一。
使用它,您可以使用功能執行器計算每個季度的總數量。函式 exec 在這里很有用,因為我們希望將日期串列作為變數傳遞給函式。
q)dts:{reverse("d"$(-3*til y) m),'-1 "d"$(-3*-1 til y) m:3 xbar"m"$x}[.z.d;8]
q)totals:{[r]?[table;enlist(within;`date;r);();(sum;`Quantity)]}each dts
如果您的資料庫是磁區的,您將需要使用不同的查詢,因為exec它不適用于磁區資料庫。這樣的事情應該作業:
totals:raze{exec Quantity from?[table;enlist(within;`date;x);0b;(enlist`Quantity)!enlist(sum;`Quantity)]}each dts
totals將是一個 8 項串列。從這里您可以使用字典來分配條形,如下所示:
q)`bar1`bar2`bar3`bar4`bar5`bar6`bar7`bar8!totals
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/396683.html
