当前位置: 首页 > 面试题库 >

创建满足给定条件的连续天数组

南门鸿畴
2023-03-14
问题内容

我在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,然后继