像 DISTINCT 一样减少重复记录,结果集必须按正确顺序排列

Reduce duplicate records like a DISTINCT , result set must be in correct order

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

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

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

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

Id 列的值对我而言并不重要,因此结果的第一组是 124/5,但 123/5 也适用于我。我刚刚添加了 ID 列,因为我想以某种方式使用 Id 列 SELECT.

本来我想使用 DISTINCT,但我意识到结果集不会同时包含 B 列为 5 的记录。

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

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

很难准确地说出您想要什么,但这会产生您指定的结果:

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

假设以下 table...

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

Id与你的例子不完全一样,但我认为你的目标是这样的。

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

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

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