时间依赖的qUERIES

时间:2017-04-14 04:40:17

标签: mysql sql

我需要一些帮助来解决以下SQL请求

EmpId   StartDate   EndDate
1   1/2/2017    12/31/9999
1   8/10/2016   1/1/2017
1   10/11/2015  8/9/2016
1   2/10/2014   10/19/2015

以上是表格数据......

用户提供ex的日期范围: 用户输入日期范围10/11/2015 1/1/2017

Q1)我需要从表中提取对用户输入范围有效的所有记录 Q2)对于每个记录,我需要先前的记录开始日期 - 所以输出应该是这样的

EmpId   StartDate   EndDate Last Start Date
1   8/10/2016   1/1/2017    10/11/2015
1   10/11/2015  8/9/2016    2/10/2014

感谢任何帮助..

由于 斯

1 个答案:

答案 0 :(得分:0)

如果开始日期和结束日期类型为DATE或TIMESTAMP:

,则此查询应该有效

SET @rangeStart =' 2015/10/11&#39 ;; SET @rangeEnd =' 2017/01/01';

SELECT
    `EmpId`,
    `StartDate`,
    `EndDate`,
    (SELECT max(`StartDate`) 
            FROM `employees` e1 
            WHERE e1.`StartDate` < e.`StartDate` 
            ORDER BY e1.`StartDate` DESC 
            LIMIT 1) as `LastStartDate`
FROM `employees` e
WHERE @rangeStart <= `StartDate` AND `EndDate` <= @rangeEnd
GROUP BY `EmpId`, `StartDate`,`EndDate`
ORDER BY `EmpId`, `StartDate` DESC,`EndDate` DESC;

请参阅SQL Fiddle Here。由于您没有指定表名,我使用了员工。

也可以使用左连接来完成,在大型数据集上可能更快:

SELECT
    e.`EmpId`,
    e.`StartDate`,
    e.`EndDate`,
    IFNULL(e1.`StartDate`,"") as `LastStartDate`
FROM `employees` e
LEFT JOIN `employees` e1
    ON e.`EmpId` = e1.`EmpId`
    AND e1.`StartDate` < e.`StartDate`
WHERE @rangeStart <= e.`StartDate` AND e.`EndDate` <= @rangeEnd
GROUP BY `EmpId`, `StartDate`,`EndDate`
ORDER BY `EmpId`, `StartDate` DESC,`EndDate` DESC;

两者的SQL小提琴是here