具有日期辅助功能的T-SQL SELECT查询

时间:2019-02-06 16:40:06

标签: sql-server tsql

更新

我认为,有一个更简单的解决方案也可以节省处理时间。我可以删除所有状态为“已完成”且状态为“正在进行”的记录,然后再完成。

那样,我只需要简单地查询到status ='进行中'的First_value。

我该怎么写?


我正在处理数据库。我有一个包含以下记录的表,引号描述了输入的列,我的问题的重点是日期和状态

  • 名称“用户名称是从CSV自动填充的”
  • 位置“ NC,SC,NJ,ETC”

  • 城市“迦太基,默特尔比奇,ETC”

  • 日期“当导入格式为YEAR-MM-DD的CSV时,SQL将自动输入输入的日期记录”
  • 状态“正在进行或已完成是仅有的两个条目”

Date列和status列会定期更新。

我需要我的SELECT DISTINCT查询才能在“状态”列=“进行中”时的第一个日期之前返回记录。那部分,我知道该怎么做。但是,每当某条记录的状态栏一天变为“已完成”并且以后添加新记录且状态为正在进行时,我会看到有史以来第一条记录,其中“状态”字段为“正在进行”。

我附上了我正在谈论的内容的视觉效果。我需要查询以从左侧返回第三个框,而不是第一个。

visual of what the I'm talking about

3 个答案:

答案 0 :(得分:0)

您可以使用子查询,该子查询返回状态为'Ongoing时的最小日期,此后不存在状态为Completed的记录,例如:

SELECT t.*
FROM mytable t
WHERE t.status = 'Ongoing'
AND t.date = (
    SELECT MIN(t1.date)
    FROM mytable t1
    WHERE t1.status = 'Ongoing'
    AND NOT EXISTS (SELECT 1 FROM mytable WHERE status = 'Completed' AND date > t1.date)
)

答案 1 :(得分:0)

释义...

  • 您想要每个name, location, city组合一个记录吗?
  • 该记录本身必须具有status = 'Ongoing',但也必须紧接status = 'Ongoing'之前没有记录。
  • 在这些潜在记录中,您需要最后一个。

使用分析功能,您可以做到...

WITH
    with_previous_status
AS
(
    SELECT
        *,
        LEAD(status, 1, 'Ongoing')
           OVER (PARTITION BY name, location, city
                     ORDER BY date DESC
                )
                   AS previous_status
    FROM
        yourTable
),
    filtered_and_sorted
(
    SELECT
        *,
        ROW_NUMBER()
            OVER (PARTITION BY name, location, city
                      ORDER BY date DESC
                 )
                    AS sequence_number
    FROM
        with_previous_status
    WHERE
        previous_status <> 'Ongoing'
        AND      status  = 'Ongoing'
)
SELECT
    name, location, city, date, status
FROM
    filtered_and_sorted
WHERE
    sequence_number = 1

尽管与使用NOT EXISTS()相关子查询相比,它的代码更长,但这应该使执行成本最小化,因此可能更快。

为了获得最佳性能,您可能希望在...上使用一个索引。

CREATE INDEX
    mytable_nlcds
ON mytable (
    name,
    location,
    city,
    date DESC,
    status
)

答案 2 :(得分:0)

所以

我基本上已经创建了两个表。一个正在进行,另一个完成。

然后,我只是将新记录追加到已完成的表中,然后基于SELECT * Last_value([t1.Date])运行CREATE TO。然后,我按名称和城市在进行中的表ON完整表上运行DELETE左联接,其中t1.date> t2.date。

这为我解决了这个问题。这是一个额外的步骤,但是它运行速度很快,并且可以减小数据库的大小。

谢谢大家的建议!