Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-删除仅更改一列的行_Sql_Select - Fatal编程技术网

SQL-删除仅更改一列的行

SQL-删除仅更改一列的行,sql,select,Sql,Select,我在SQL中有一个很大的表,其中一个有效的_from date列应该在其他列每次更改时更新。但是,由于某些原因,有许多行中的“生效日期”发生了更改,但没有其他值发生更改。例如: CODE NAME EFFECTIVE_FROM CCWA Oak 1999 CCWA Willow 2001 CCWA Willow 2004 SELECT code, name, max(EFFECTIVE_FROM) FROM tablename GROUP BY co

我在SQL中有一个很大的表,其中一个有效的_from date列应该在其他列每次更改时更新。但是,由于某些原因,有许多行中的“生效日期”发生了更改,但没有其他值发生更改。例如:

CODE    NAME    EFFECTIVE_FROM
CCWA    Oak     1999
CCWA    Willow  2001
CCWA    Willow  2004
SELECT code, name, max(EFFECTIVE_FROM) 
FROM tablename
GROUP BY code, name                                      
如何删除生效日期的更改未提供任何信息的行。e、 g.上表第三行

SELECT code, name, max(EFFECTIVE_FROM) 
FROM tablename
GROUP BY code, name                                      
这些表非常大,所以我更喜欢使用SELECT语句,而不是DELETE或ALTER语句,因为它们看起来很慢

SELECT code, name, max(EFFECTIVE_FROM) 
FROM tablename
GROUP BY code, name                                      

非常感谢任何帮助

我相信您正在寻找:

SELECT Code, Name, MAX(EFFECTIVE_FROM)
FROM myTable 
GROUP BY  Code, Name
SELECT code, name, max(EFFECTIVE_FROM) 
FROM tablename
GROUP BY code, name                                      

试试这个:

SELECT code, name, max(EFFECTIVE_FROM) 
FROM tablename
GROUP BY code, name                                      

由于是较晚的日期不添加任何信息,因此需要选择最小日期值

SELECT code, name, max(EFFECTIVE_FROM) 
FROM tablename
GROUP BY code, name                                      
SELECT Code, Name, MIN(EFFECTIVE_FROM)
FROM CodeTable 
GROUP BY Code, Name
您想使用滞后。没有重复项的结果集:

SELECT code, name, max(EFFECTIVE_FROM) 
FROM tablename
GROUP BY code, name                                      
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);

这假设代码和名称从不为NULL。这很容易融入逻辑,但会使where子句有点复杂。

你的问题并没有明确你想要达到的真正结果:如果你想从表中永久删除元素,你需要使用delete,如果你的目标只是过滤掉你描述的重复项,您可以使用SELECT,元素将保留在表中

SELECT code, name, max(EFFECTIVE_FROM) 
FROM tablename
GROUP BY code, name                                      
<> P>你考虑使用删除的事实使我认为除了日期之外,这种重复是不可取的。 在这种情况下,您也可以考虑添加一个触发器,当信息字段以外的所有字段都不被更改时,可以阻止插入,这样只有有趣的数据更改才会生成新的行。p>
SELECT code, name, max(EFFECTIVE_FROM) 
FROM tablename
GROUP BY code, name                                      
然后,您可以执行一次操作,删除所有重复的元素,这些元素不反映夜间要执行的任何数据更改操作,或者当系统负载较低或无人使用时(如果您键入的表非常大)

SELECT code, name, max(EFFECTIVE_FROM) 
FROM tablename
GROUP BY code, name                                      

这种解决方案改变了此表的性质,事实上,在没有实际数据更改的情况下,您将丢失更新的历史信息。只有当这些信息对你的目标不是必需的时候,才考虑这个解决方案。我想我是想得太多了!
SELECT code, name, max(EFFECTIVE_FROM) 
FROM tablename
GROUP BY code, name