开发者社区 问答 正文

T-SQL从组中删除重复项但未从每个组中获得前1名

我有以下几行:

| 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),但未成功。

展开
收起
心有灵_夕 2019-12-22 15:22:35 592 分享 版权
阿里云 AI 助理回答

根据您的描述,您希望在保留每次状态变更记录的同时,去除那些状态没有实际变化的连续重复行。您尝试使用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()函数则用来获取同一CodeType分组内上一行的SubType值,以便比较状态是否有变。

然后,在主查询中,我们只选择那些首次出现的行(prev_SubType IS NULL,即每个分组的第一行)或当前SubType与前一行不同的行,这样就排除了那些状态没有变化的连续重复行。

请将YourTableName替换为您的实际表名,并根据实际情况调整列名。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答标签:
问答地址: