Как выбрать информацию из строки выше? - PullRequest
3 голосов
/ 20 января 2012

Я хочу добавить в свою таблицу столбец, подобный следующему: Это всего лишь пример того, как таблица структурирована, реальная таблица содержит более 10.000 строк.

No_   Name       Account_Type    Subgroup     (New_Column)
100   Sales      3               
200   Underwear  0               250          *100
300   Bikes      0               250          *100
400   Profit     3                             
500   Cash       0               450          *400

Так что длякаждый раз, когда есть значение в «Подгруппе», я хочу, чтобы (New_Column) получал значение [No_] из строки выше

No_   Name       Account_Type    Subgroup     (New_Column)
100   Sales      3               
150   TotalSales 3
200   Underwear  0               250          *150
300   Bikes      0               250          *150
400   Profit     3                             
500   Cash       0               450          *400

В некоторых случаях таблица похожа на приведенную выше, где два "Заголовки "выше.И в этом случае я также хочу первую выше строку (150) в этом случае.

Это случай для курсора или что вы рекомендуете?

Данные упорядочены по No_

- EDIT -

Начиная с первой строки и затем по всей таблице: есть ли способ сохранитьзначение для [No_], где [Subgroup] равно ''?И после этого вставьте это значение [No_] в (New_Column) в каждой строке ниже, имеющей значение в строке [Subgroup].И когда строка [Подгруппа] пуста, процесс будет продолжаться, вставляя следующее значение [No_] в (New_Column), то есть, если следующая строка имеет значение в [Подгруппе]

Вот лучшеизображение для того, что я пытаюсь сделать: enter image description here

Ответы [ 5 ]

3 голосов
/ 05 ноября 2013

SQL Server 2012 предлагает использовать функции смещения окна. В этом случае: LAG

Примерно так:

SELECT [No_]
  ,[Name]
  ,[Account_Type]
  ,[Subgroup]
  ,LAG([No_]) OVER(PARTITION BY [Subgroup]
ORDER BY [No_]) as [PrevValue]
FROM table

Вот пример из MS: http://technet.microsoft.com/en-us/library/hh231256.aspx

2 голосов
/ 20 января 2012

Функция ROW_NUMBER позволит вам узнать, какое число является строкой, но поскольку это оконная функция, вам придется использовать общее табличное выражение (CTE) для объединения таблицы с самой собой.

WITH cte AS
(
    SELECT [No_], Name, Account_Type, Subgroup, [Row] = ROW_NUMBER() OVER (ORDER BY [No_])
    FROM table
)
SELECT t1.*, t2.[No_]
FROM cte t1 
LEFT JOIN cte t2 ON t1.Row = t2.Row - 1

Надеюсь, это поможет.

0 голосов
/ 23 января 2012
SELECT
      No_
    , Name 
    , Account_Type 
    , Subgroup 
    , ( SELECT MAX(above.No_) 
        FROM TableX AS above
        WHERE above.No_ < a.No_
          AND above.Account_Type = 3
          AND a.Account_Type <> 3
      ) AS NewColumn
FROM
      TableX AS a
0 голосов
/ 20 января 2012

Итак, в SQL Server 2008 я создал тестовую таблицу с тремя значениями в ней:

create table #ttable
(
    id int primary key identity,
    number int,
    number_prev int
)
Go
Insert Into #ttable (number) 
Output inserted.id
Values (10), (20), (30);

Вставьте в таблицу, что делает то, что вам нужно (по крайней мере, если все правильно поняли) выглядит так:

declare @new_value int;
set @new_value = 13; -- NEW value
Insert Into #ttable (number, number_prev)
Values (@new_value, 
    (Select Max(number) From #ttable t Where t.number < @new_value)) 

[Эта часть добавлена] И для работы с подгруппой - просто измените внутренний выбор, чтобы отфильтровать его:

Select Max(number) From #ttable t 
Where t.number < @new_value And Subgroup != @Subgroup
0 голосов
/ 20 января 2012

Следующий запрос вернет имя строки parent вместо самой строки, т. Е. Sales for обоих: Sales, Underwear, Bikes;и прибыль за прибыль, наличные:

select ISNULL(t2.Name, t1.Name)
from table t1
left join table t2 on t1.NewColumn = t2.No
...