像 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;
原始数据集是这样的(但是长了很多)
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;