更新
我认为,有一个更简单的解决方案也可以节省处理时间。我可以删除所有状态为“已完成”且状态为“正在进行”的记录,然后再完成。
那样,我只需要简单地查询到status ='进行中'的First_value。
我该怎么写?
我正在处理数据库。我有一个包含以下记录的表,引号描述了输入的列,我的问题的重点是日期和状态
位置“ NC,SC,NJ,ETC”
城市“迦太基,默特尔比奇,ETC”
Date
列和status
列会定期更新。
我需要我的SELECT DISTINCT
查询才能在“状态”列=“进行中”时的第一个日期之前返回记录。那部分,我知道该怎么做。但是,每当某条记录的状态栏一天变为“已完成”并且以后添加新记录且状态为正在进行时,我会看到有史以来第一条记录,其中“状态”字段为“正在进行”。
我附上了我正在谈论的内容的视觉效果。我需要查询以从左侧返回第三个框,而不是第一个。
答案 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。
这为我解决了这个问题。这是一个额外的步骤,但是它运行速度很快,并且可以减小数据库的大小。
谢谢大家的建议!