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

时间:2018-02-17 19:34:59

标签: mysql sql

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

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

创建的表需要在“数据”表更新时自动更新。

enter image description here

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

考虑同一个表上的CROSS JOIN 数据,避免反向重复和相同的日期:

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 ... SELECTNOT EXISTS子句中的WHERE是为了避免重复行。

-- 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`);

答案 1 :(得分:0)

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

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只是前瞻性的而且我的钱在他身上:)

我希望这会有所帮助。