我在SQL中有一个大表,每当其中一个列发生更改时,effective_from date列应该更新。但是,由于某种原因,有许多行,其中effective_from日期更改,但没有其他值已更改。例如:
CODE NAME EFFECTIVE_FROM
CCWA Oak 1999
CCWA Willow 2001
CCWA Willow 2004
如何删除effective_from date中的更改未提供任何信息的行。例如上表中的第三行。
这些表非常大,所以我更喜欢使用SELECT语句而不是DELETE或ALTER,这似乎很慢。
非常感谢任何帮助!
答案 0 :(得分:1)
我相信你在寻找:
SELECT Code, Name, MAX(EFFECTIVE_FROM)
FROM myTable
GROUP BY Code, Name
答案 1 :(得分:0)
试试这个:
SELECT code, name, max(EFFECTIVE_FROM)
FROM tablename
GROUP BY code, name
答案 2 :(得分:0)
由于更晚的日期未添加任何信息,因此您需要选择最小日期值。
<svg>
答案 3 :(得分:0)
您想使用lag()
。结果集没有重复:
select t.*
from (select t.*,
lag(code) over (order by effective_from) as prev_code,
lag(name) over (order by effective_from) as prev_name
from t
) t
where (prev_code <> code or prev_code is null) and
(prev_name <> name or prev_name is null);
这假定code
和name
永远不会NULL
。这很容易合并到逻辑中(但它使where
子句有点复杂)。
答案 4 :(得分:0)
您的问题并未明确您想要实现的实际结果:如果您想永久删除表中的元素,则需要使用DELETE,如果您的目标只是过滤掉您描述的重复项,则可以使用一个SELECT(元素将保留在表中)。
你考虑使用DELETE的事实让我想到这个&#34;重复&#34; (日期除外)是不可取的。 在这种情况下,您还可以考虑在信息字段(除EFFECTIVE_FROM之外的所有字段)未更改时添加阻止插入的触发器,这样只有有趣的数据更改才会生成新行。
然后你可以执行一次性操作,删除所有不反映任何数据变化的重复元素(夜间操作,或者当系统负载较低或没有人使用它时,如果当你输入时,表格非常大。
这种解决方案会改变此表的性质,实际上您会在没有实际数据更改的情况下丢失更新的历史信息。只有在目标不需要这些信息时才考虑此解决方案。