我有以下几行:
| Code | Type | SubType | Date |
|:----:|:----:|:-------:|:----------:|
| 100 | 10 | 1 | 17.12.2019 |
| 100 | 10 | 2 | 18.12.2019 |
| 100 | 10 | 2 | 19.12.2019 |
| 100 | 10 | 1 | 20.12.2019 |
我需要的是让基于行组Code,Type和SubType列。但是,不仅我应该保持Date列,但我必须删除重复的行(根据Code,Type并SubType从那些在中间如下组列):
| Code | Type | SubType | Date |
|:----:|:----:|:-------:|:----------:|
| 100 | 10 | 1 | 17.12.2019 |
| 100 | 10 | 2 | 18.12.2019 |
| 100 | 10 | 1 | 20.12.2019 |
让我详细解释导致这种情况的情况,因此,在显示给最终用户之前,我需要清除数据。我有具有4列的历史表(Code,Type,SubType和Date)。该表的每一行都显示在特定日期该行的字段值发生的更改。例如,在上面的示例中,该行在4个不同的日期进行了4次更改。起初,一直与产生该行Code = 100,Type = 10并SubType = 1在17.12.2019。然后,SubType已改为2在18.12.2019。第二天,位于19.12.2019,SubType已再次更改为2(对于我来说是重复的)。最后,SubType已再次更改1为20.12.2019。实际上,我不需要显示第三次更改,因为在我的情况下它是重复的。
我尝试使用Row_Number()Over(Partition by Code, Type and SubType Order By Date),但未成功。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据您的描述,您希望在保留每次状态变更记录的同时,去除那些状态没有实际变化的连续重复行。您尝试使用ROW_NUMBER()
函数的方法是正确的思路,但可能需要稍作调整来达到目的。这里的关键在于如何定义“重复”,即在状态没有改变的情况下日期连续的行视为重复。
您可以尝试以下SQL查询语句:
WITH CTE AS (
SELECT
Code, Type, SubType, Date,
ROW_NUMBER() OVER (PARTITION BY Code, Type, SubType ORDER BY Date) AS rn,
LAG(SubType) OVER (PARTITION BY Code, Type ORDER BY Date) AS prev_SubType
FROM
YourTableName
)
SELECT
Code, Type, SubType, Date
FROM
CTE
WHERE
prev_SubType IS NULL OR SubType != prev_SubType
ORDER BY
Date;
这段SQL首先创建了一个带有行号(rn)和前一行SubType值(prev_SubType)的临时表(CTE)。ROW_NUMBER()
用于为每个Code
, Type
, SubType
组合内的行分配一个唯一的数字,按日期排序。LAG()
函数则用来获取同一Code
和Type
分组内上一行的SubType
值,以便比较状态是否有变。
然后,在主查询中,我们只选择那些首次出现的行(prev_SubType IS NULL
,即每个分组的第一行)或当前SubType
与前一行不同的行,这样就排除了那些状态没有变化的连续重复行。
请将YourTableName
替换为您的实际表名,并根据实际情况调整列名。