如何重复另一列的(有序)列分组的第一个值

时间:2014-01-27 12:03:17

标签: sql sql-server-2012

我有一个简单的表,按列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,但最后我还没有找到解决方案对我来说,首先看起来像一个简单的问题。

3 个答案:

答案 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