我有一个简单的表,按列ind排序并包含
create table #test (Ind int, Value int);
insert into #test (Ind, Value) values
(1, 3),
(2, 3),
(3, 3),
(4, 5),
(5, 6),
(6, 6),
(7, 3),
(8, 3);
现在我需要一个返回三列的查询:Ind,value和FirstInd。 FirstInd应该是一组“值”列中的第一个“Ind”值:
Ind Value FirstInd
1 3 1
2 3 1
3 3 1
4 5 4
5 6 5
6 6 5
7 3 7
8 3 7
我已经尝试了几件事,因为我正在使用SQL Server 2012,我也可以使用“滞后(Ind)over(Group by Ind)”来获得FirstInd,但最后我还没有找到解决方案对我来说,首先看起来像一个简单的问题。
答案 0 :(得分:4)
试试这个:
select ind, value, min(ind) over (partition by value, grp) as FirstInd
from (select t.*, sum(GrpStart) over (order by Ind) as Grp
from (select t.*,
(case when lag(value) over (order by ind) = value then 0 else 1
end) as GrpStart
from t
) t
) t;
想法是找到连续值组的起始位置。您可以使用value
将当前value
与之前的lag()
进行比较,从而实现此目的。当它们不同时,就没有开始。这是一排的旗帜。
然后,对于任何给定的行,在前面的行上总结这些标志值。这会为连续值生成grp
标识符。外部查询只查找该组中的最小ind。
答案 1 :(得分:1)
请尝试..
SELECT MIN(IND) OVER(PARTITION BY Value ORDER BY Value) AS FirstInd, Ind, Value FROM #test
答案 2 :(得分:1)
WITH t AS (
SELECT
Ind,
Value,
ROW_NUMBER() OVER(ORDER BY Ind) - ROW_NUMBER() OVER(PARTITION BY Value ORDER BY Ind) AS GrpId
FROM #test
)
SELECT
Ind,
Value,
MIN(Ind) OVER(PARTITION BY GrpId, Value)
FROM t
ORDER BY Ind