By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
/* DATA SETUP */
CREATE TABLE #Table (SortID int IDENTITY(1,1), BitValue bit);
INSERT INTO #Table (BitValue)
VALUES (0), (1), (1), (1), (0), (1), (1);
SELECT * FROM #Table;
SortID | BitValue |
---|---|
1 | False |
2 | True |
3 | True |
4 | True |
5 | False |
6 | True |
7 | True |
/* ANSWER */
DECLARE @a int;
SET @a = 2;
WITH Grouped_BitValues AS
(SELECT SortID, BitValue,
CASE WHEN BitValue = 0 THEN 1 ELSE 0 END AS NewGrpFlag,
SUM(CASE WHEN BitValue = 0 THEN 1 ELSE 0 END) OVER (ORDER BY SortID) AS GroupNum
FROM #Table
)
SELECT BitValue, POWER(@a, ROW_NUMBER() OVER (PARTITION BY GroupNum ORDER BY SortID) -1) AS Geometric_Sequence
FROM Grouped_BitValues
ORDER BY SortID;
BitValue | Geometric_Sequence |
---|---|
False | 1 |
True | 2 |
True | 4 |
True | 8 |
False | 1 |
True | 2 |
True | 4 |
/* CTE Component */
SELECT SortID, BitValue,
CASE WHEN BitValue = 0 THEN 1 ELSE 0 END AS NewGrpFlag,
SUM(CASE WHEN BitValue = 0 THEN 1 ELSE 0 END) OVER (ORDER BY SortID) AS GroupNum
FROM #Table;
SortID | BitValue | NewGrpFlag | GroupNum |
---|---|---|---|
1 | False | 1 | 1 |
2 | True | 0 | 1 |
3 | True | 0 | 1 |
4 | True | 0 | 1 |
5 | False | 1 | 2 |
6 | True | 0 | 2 |
7 | True | 0 | 2 |
/* ALL DATA (WITH @a = 2) */
WITH Grouped_BitValues AS
(SELECT SortID, BitValue,
CASE WHEN BitValue = 0 THEN 1 ELSE 0 END AS NewGrpFlag,
SUM(CASE WHEN BitValue = 0 THEN 1 ELSE 0 END) OVER (ORDER BY SortID) AS GroupNum
FROM #Table
)
SELECT Grouped_BitValues.*, POWER(2, ROW_NUMBER() OVER (PARTITION BY GroupNum ORDER BY SortID) -1) AS Geometric_Sequence
FROM Grouped_BitValues
ORDER BY SortID;
SortID | BitValue | NewGrpFlag | GroupNum | Geometric_Sequence |
---|---|---|---|---|
1 | False | 1 | 1 | 1 |
2 | True | 0 | 1 | 2 |
3 | True | 0 | 1 | 4 |
4 | True | 0 | 1 | 8 |
5 | False | 1 | 2 | 1 |
6 | True | 0 | 2 | 2 |
7 | True | 0 | 2 | 4 |