我試圖在SQLLite中爲我的應用組織一個查詢,並希望請求一些幫助。查詢銷售情況,按星期分組
我想寫查詢:
「我與用戶ID X用戶對於我個人的工作周,這會在我想要的任何一天d(星期日開始到週六,週一至週日,等等),我想看看哪個工作周是我的最差的,這是我的最好的銷售額。
簡單地說,「最差」和「最好」僅僅意味着最高和最低的銷售總額
如果每個人的工作周在週日開始,這很容易,但事實並非如此,我必須克服將數據庫中的所有行分組的問題不僅僅是一週,而是一個自定義周(用戶定義哪一天開始和結束一週)。例如,如果我的工作周從星期天開始,那麼在過去一週,5月28日的星期是一個星期天,這是我工作周的開始(並且在6月3日星期六結束)。我會按照這個模式來查看錶格中的所有記錄。
但是,不同的用戶可以在5月29日星期一開始工作,並在6月2日星期五結束工作。
因此,這意味着對於用戶1,我想從星期天的開始日期到星期六的結束日期對他的行進行分組(然後將它們全部彙總,並將第一個和最後一個記錄用於銷售)。
對於用戶2,但是,我想他的集團在週一的日期範圍記錄到週日
這是我在哪裏爲止。我想我很接近。 (請注意,我將日期存儲爲以毫秒爲單位的unix時間戳,因此除以1000和unixepoch部分)。 + d部分實際上是一個基於一天的開始的整數,但我還沒有弄清楚這個數字應該是什麼。就在我認爲我得到它的時候,它就會在別人的一天失敗。
SELECT 'Date', SUM(Amount) 'Amount'
FROM Sales WHERE UserID = x
GROUP BY CAST((julianday((datetime(CreationDate/1000, 'unixepoch', 'localtime')) + d)/7) AS INT)
有沒有人認爲他們可以給我一隻手? :)
非常感謝!
編輯
非常感謝你的幫助!
對於+ d問題(值'd'應該抵消多少)? 以下是我在測試後發現的,並且據我所知可以工作。我知道Sqllite使用0作爲星期日,1作爲星期一等,我知道我們正在分組和除以7(每週7天),但是有任何想法爲什麼這些將是'd'的正確值作爲偏移量?它現在似乎在工作。我看到模式去2,1,0,6,5,4,3但有點奇怪的順序去呃?
if (day == Sunday) //if your work week starts on Sunday, d=2
return 2
else if (day == Monday)
return 1
else if (day == Tuesday)
return 0
else if (day == Wednesday)
return 6
else if (day == Thursday)
return 5
else if (day == Friday)
return 4
else if (day == Saturday)
return 3
請提供一個[mcve],即適合定製的玩具數據庫的'.dump'。 – Yunnosch
2,1,0,6,5,4,3並不奇怪。我們將數字0到6添加到Julian日數。當我們加0時,我們明顯地從星期二開始。所以當我們再增加一個時,我們就開始前一天,即星期一。這一直持續到星期三開始增加六點。把數字2,1,0,6,5,4,3寫成一個圓圈,你會看到它們都是連續的。如果我們加了7,那麼我們將再次從星期二開始,所以我們可以爲這些數字添加7(或14或21或-7等)。所以我們可以將9,8,7,6,5,4,3的數字相加或減去5,6,7,8,9,10,11。 –