我在SQL Server中具有以下数据结构表:
ID Date Allocation
1, 2012-01-01, 0
2, 2012-01-02, 2
3, 2012-01-03, 0
4, 2012-01-04, 0
5, 2012-01-05, 0
6, 2012-01-06, 5
等等。
我需要做的是获取所有连续的日子,其中Allocation = 0,并采用以下形式:
Start Date End Date DayCount
2012-01-01 2012-01-01 1
2012-01-03 2012-01-05 3
等等。
可以在SQL中执行此操作吗?如果可以,如何执行?
在此答案中,我将假定“ id”字段按递增日期进行排序时,对行进行连续编号,就像示例数据中所做的那样。(如果不存在,则可以创建这样的列)。
这是此处和此处描述的技术示例。
1)在相邻的“ id”值上将表与其自身连接。这将相邻的行配对。选择“分配”字段已更改的行。将结果存储在临时表中,该表还保持运行索引。
SET @idx = 0;
CREATE TEMPORARY TABLE boundaries
SELECT
(@idx := @idx + 1) AS idx,
a1.date AS prev_end,
a2.date AS next_start,
a1.allocation as allocation
FROM allocations a1
JOIN allocations a2
ON (a2.id = a1.id + 1)
WHERE a1.allocation != a2.allocation;
这将为您提供一个表,在每行中具有“上一个期间的结束”,“下一个期间的开始”和“上一个期间的’allocation’的值”:
+------+------------+------------+------------+
| idx | prev_end | next_start | allocation |
+------+------------+------------+------------+
| 1 | 2012-01-01 | 2012-01-02 | 0 |
| 2 | 2012-01-02 | 2012-01-03 | 2 |
| 3 | 2012-01-05 | 2012-01-06 | 0 |
+------+------------+------------+------------+
2)我们需要在同一行中每个周期的开始和结束,因此我们需要再次合并相邻的行。通过创建第二个临时表(例如,boundaries
但具有idx
更大的字段1)来做到这一点:
+------+------------+------------+
| idx | prev_end | next_start |
+------+------------+------------+
| 2 | 2012-01-01 | 2012-01-02 |
| 3 | 2012-01-02 | 2012-01-03 |
| 4 | 2012-01-05 | 2012-01-06 |
+------+------------+------------+
现在加入该idx
领域,我们会得到答案:
SELECT
boundaries2.next_start AS start,
boundaries.prev_end AS end,
allocation
FROM boundaries
JOIN boundaries2
USING(idx);
+------------+------------+------------+
| start | end | allocation |
+------------+------------+------------+
| 2012-01-02 | 2012-01-02 | 2 |
| 2012-01-03 | 2012-01-05 | 0 |
+------------+------------+------------+
**请注意,此答案正确获得了“内部”时间段,但是错过了两个“边缘”时间段,其中开始时分配= 0,而结尾处分配=
5。可以在usingUNION
子句中加入这些内容,但我想提出的核心思想是没有复杂性。
问题内容: 我的Oracle数据库中具有以下结构: 我想查询只需要检查前连续几天并获取“分配”所在的计数的查询。 我想按日期选择,例如。 示例输出:对于日期,计数为。 新问题。通过Lukas Eder的查询,计数始终为或。但预期是。为什么?! 卢卡斯·埃德(Lukas Eder)的代码 预期的输出是这样的,First_day end不需要最后一天: 问题答案: 此查询将产生每一行的计数: 然后,您
问题内容: 我有一个具有以下结构的MySQL表: drinks_log(id,users_id,brinkles_id,时间戳) 我正在尝试计算用户(ID为1)每天至少记录5次饮料(ID为1)的连续几天的最大连胜纪录。我很确定可以使用以下视图来完成此操作: 但是,每次运行此检查时都为不同的用户重复创建视图似乎效率很低。MySQL中是否有一种方法可以在单个查询中执行此计算,而无需创建视图或多次重复调
所以我必须在eclipse中为我的类创建一个java项目。分配是创建一个程序,允许用户在程序中输入整数,直到输入某个整数(42)。输入整数(42)后,程序将为1。平均输入的所有数字。2、显示输入的最小值和最大值。3、输入的数字总数。这些必须在不计算(42)的情况下进行计算。这就是我目前所拥有的。我可以从用户那里获得输入,一旦他们输入42,程序就会停止并显示总数,但包括42。我不知道如何为输入添加一
本文向大家介绍计算满足C ++中给定条件的索引对,包括了计算满足C ++中给定条件的索引对的使用技巧和注意事项,需要的朋友参考一下 我们给了前N个自然数的排列数组。这里的目标是找到满足以下条件的元素的索引对- 如果数组是Arr [],则i,j是索引,对元素对进行计数,使Arr [i] + Arr [j] = max(Arr [x])使得i <= x <= j。 即,Arr [i]和A [j]之和等
我试图用Python做一个简单的计算器。 我希望用户写“and”,然后while循环应该结束。当我运行它并输入随机文本时,while循环工作并显示“重试”。然而,当我实际输入正确答案(“add”)时,while循环并没有结束——相反,它一直在说“再试一次”。 为什么会这样?我的代码怎么了?
通过循环每个资源的名称,查看分配给该人员姓名的帐户,随机选择一个,并用NA替换该人员的姓名,以减少资源分配。 可复制示例: 我到目前为止的进展: 我听说for循环是不必要的。我相信这可以通过purr包和pmap之类的东西来实现。我还在学习。 我想重复一下OwnerDF,看看那个人是否“拥有”了太多的账户。如果是,请查看原始帐户列表,随机选择一个,并将所有者的姓名替换为NA,从其计数中删除1,然后继