SQL - 从单列到两列的所有日期组合

Posted

技术标签:

【中文标题】SQL - 从单列到两列的所有日期组合【英文标题】:SQL - All combinations of dates from a single column into two columns 【发布时间】:2018-02-17 19:34:58 【问题描述】:

我有一个名为“数据”的 SQL 表,日期在第一列,第二列是每天更新的数值。

我想根据第二列中的值查看某些日期,并创建一个新表,将所有日期组合显示为两列,包括计算的天数差异列。

创建的表需要随着“数据”表的更新而自动更新。

任何帮助将不胜感激。

【问题讨论】:

我认为您需要澄清“根据第二列中的值查看某些日期”和“显示所有日期组合”的意思,因为查看您的数据我不认为您表示所有组合。 抱歉,我现在有一张桌子,上面有日期和值。我希望将这些信息发送到一个新表,该表在我每天更新表时会自动更新。我要发送的信息是所有等于 100 的日期,并将它们放入一个表中,该表有两列,日期组合从第一列中的最早日期开始,第二列中的任何日期之后,(组合日期)。如果更容易,我会接受两列中的重复项。然后是第三列,让我知道日期之间的天数差异。 【参考方案1】:

考虑在同一张表上使用CROSS JOINData,以避免反向重复和相同日期:

SELECT d1.`Date`, d2.`Date`, DATEDIFF(d1.Date, d2.Date) AS `Days`
FROM Data d1
CROSS JOIN Data d2
WHERE d1.`Date` < d2.`Date`
  AND d1.`Value` = 100 AND d2.`Value` = 100

等效于INNER JOINON 子句:

SELECT d1.`Date`, d2.`Date`, DATEDIFF(d1.Date, d2.Date) AS `Days`
FROM Data d1
INNER JOIN Data d2
 ON  d1.`Value` = d2.`Value`
 AND d1.`Value` = 100
 AND d1.`Date` < d2.`Date`

为了包含在新表中,构建表,Table100,并使用上述选择查询运行INSERT INTO ... SELECTWHERE 子句中的NOT EXISTS 是为了避免重复行。

-- RUN ONLY ONCE
CREATE TABLE Table100 (
  `Date1` Date,
  `Date2` Date,
  `Days` Integer
);

-- RUN AFTER EACH Data UPDATE
INSERT INTO Table100 (Date1, Date2, Days)
SELECT d1.`Date`, d2.`Date`, DATEDIFF(d1.Date, d2.Date) AS `Days`
FROM Data d1
INNER JOIN Data d2
 ON  d1.`Value` = d2.`Value`
 AND d1.`Value` = 100
 AND d1.`Date` < d2.`Date`

WHERE NOT EXISTS 
    (SELECT 1 FROM Table100 t
     WHERE t.`Date1` = d1.`Date`
       AND t.`Date2` = d2.`Date`);

【讨论】:

太好了,再次感谢。如果我想使用 Mod 函数而不是值 100 进行过滤。例如,使用以下函数过滤掉 4 的值:MOD(Value, 10)。 @Swulph - IIUC - 将条件:d1.Value = 100 替换为 MOD(Value, 10) = 4 哎呀!以为我有。那应该是随行评论。【参考方案2】:

查看您的数据,我认为您需要以下内容:

select t1.date as date1, t2.date as date2, datediff(t1.date, t2.date) as days
    from table1 t1
    cross join table2 t2
    where t1.value = 100 and t2.value = 100
        and t1.date <> t2.date

我们现在有两个版本,我相信 Parfait 会起作用。我的不同之处在于它给出了所有日期组合,包括前瞻和后视,最后一行and t1.date &lt;&gt; t2.date(可选)消除了同一天的组合。 Parfait 只具有前瞻性,我的钱在他身上 :)

我希望这会有所帮助。

【讨论】:

@Parfait - 感谢您的留言。

以上是关于SQL - 从单列到两列的所有日期组合的主要内容,如果未能解决你的问题,请参考以下文章

基于sql中的第三列返回两列的所有组合

如何检索表的值以获取sql中两列的最大值

python:两列的组合

在excel中查找两列的组合,一列中有一个条件

sql server 中有一张表,我想把表中两列的数据合并后插入本表中另一列!请问怎么实现

SQL Server中的组合