原始資料集是這樣的(但要長很多)
| ID | B欄 |
|---|---|
| 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 | B欄 |
|---|---|
| 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,但如果需要,我可以升級資料庫。
uj5u.com熱心網友回復:
查看您的資料,您可能需要一種解決方案來識別要包含在聚合中的順序組。
以下是否提供了可用的解決方案?
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;
參見示例 DB<>Fiddle
uj5u.com熱心網友回復:
假設下表...
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 | B欄 |
|---|---|
| 124 | 5 |
| 125 | 6 |
| 127 | 7 |
| 131 | 8 |
| 133 | 5 |
s 與您的示例中的Id不完全相同,但我認為您的目標是這樣的。
uj5u.com熱心網友回復:
確切地說出您想要什么有點困難,但這會產生您指定的結果:
select bcolumn, min(id)
from t
group by bcolumn
union all
select 5, max(id)
from t
where bcolumn = 5;
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/415069.html
標籤:
上一篇:過濾并執行多個計算
