【问题标题】:Reduce duplicate records like a DISTINCT , result set must be in correct order减少像 DISTINCT 这样的重复记录,结果集必须是正确的顺序
【发布时间】:2021-11-03 15:51:51
【问题描述】:

原始数据集是这样的(但要长很多)

Id Bcolumn
123 5
124 5
125 6
126 7
127 7
128 8
129 8
130 8
131 8
132 5
133 5

我需要在这个集合上的 Bcolumn 上做类似 DISTINCT 的东西,但结果集的顺序必须与默认集的顺序相同。并且 5 必须在集合的开头和集合的结尾。所以基本上结果应该是这样的。

Id Bcolumn
124 5
125 6
126 7
130 8
133 5

在我的情况下,Id 列的值并不重要,因此结果的第一组是 124/5,但 123/5 也适用于我。我刚刚添加了 ID 列,因为我想在一个花哨的 SELECT 中以某种方式使用 Id 列。

最初我正在考虑使用 DISTINCT,但我意识到结果集不会包含 Bcolumn 上 5 的两条记录。

所以目前我最好的选择是使用 fetch-next/cursor 之类的东西,创建一个临时表,但这会又大又丑,我希望这可以以更好的方式完成。

注意 - 我使用的是 MS SQL 2008,但如果需要,我可以升级数据库。

【问题讨论】:

  • 但如果需要我可以升级数据库 - 那你应该升级!

标签: sql sql-server-2008


【解决方案1】:

查看您的数据显示,您可能需要一种解决方案来识别要包含在聚合中的顺序组。

以下是否提供了可用的解决方案?

with g as (
select *,  row_number() over(partition by b order by id) r, row_number() over(order by id) rn
from t
)
select max(id) Id, b
from g
group by b, rn-r
order by Id;

See example DB<>Fiddle

【讨论】:

    【解决方案2】:

    假设下表...

    SELECT
        Id,
        Bcolumn
    INTO
        #T
    FROM
        (VALUES 
            (123, 5),
            (124, 5),
            (125, 6),
            (126, 7),
            (127, 7),
            (128, 8),
            (129, 8),
            (130, 8),
            (131, 8),
            (132, 5),
            (133, 5)
        ) T(Id, Bcolumn);
    

    ...以下查询...

    SELECT
        *
    FROM
        #T T_CURRENT
    WHERE
        Bcolumn NOT IN (
            SELECT TOP 1
                Bcolumn
            FROM
                #T T_NEXT
            WHERE
                T_CURRENT.Id < T_NEXT.Id
            ORDER BY
                T_NEXT.Id
        )
    ORDER BY
        Id;
    

    ...给出以下结果:

    Id Bcolumn
    124 5
    125 6
    127 7
    131 8
    133 5

    Ids 与您的示例不完全相同,但我认为您的目标是这样的。

    【讨论】:

      【解决方案3】:

      确切地说出您想要什么有点困难,但这会产生您指定的结果:

      select bcolumn, min(id)
      from t
      group by bcolumn
      union all
      select 5, max(id)
      from t
      where bcolumn = 5;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-19
        • 2013-08-09
        • 2018-09-06
        相关资源
        最近更新 更多