【发布时间】:2017-11-04 12:12:46
【问题描述】:
我正在尝试在 SQLLite 中为我的应用程序组合一个查询,并希望得到一些帮助。
我要写的查询:
“我是用户 ID x 的用户。对于我的个人工作周,可以从我想要的任何一天 D(周日到周六、周一到周日等)开始,我想看看哪个工作周就销售而言,这是我最差的,也是我最好的。
为了简单起见,“最差”和“最好”仅表示该周最高和最低销售额的总和。
如果每个人的工作周从星期日开始,这很容易,但事实并非如此。我必须克服一个 SQL 挑战,即不仅按周分组数据库表中的所有行,还按自定义周分组(用户定义一周的开始和结束日期)。
例如,如果我的工作周从星期日开始,那么过去一周,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
【问题讨论】:
-
请提供minimal reproducible example,即适当定制玩具数据库的
.dump。 -
2,1,0,6,5,4,3 并不奇怪。我们将数字 0 到 6 添加到儒略日数。当我们添加 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。