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 JOIN
,Data,以避免反向重复和相同日期:
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 JOIN
和ON
子句:
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 ... SELECT
。 WHERE
子句中的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 <> t2.date
(可选)消除了同一天的组合。 Parfait 只具有前瞻性,我的钱在他身上 :)
我希望这会有所帮助。
【讨论】:
@Parfait - 感谢您的留言。以上是关于SQL - 从单列到两列的所有日期组合的主要内容,如果未能解决你的问题,请参考以下文章