создать новый столбец, используя другие столбцы - PullRequest
2 голосов
/ 18 мая 2011

Я застрял в создании нового столбца. Таблица имеет три столбца (C_ID, C_rank, Date).

C_ID C_ Rank NewColumn(Cycle) Date
 42     A        1            October 14, 2010
 42     B        1            October 26, 2010
 42     A        2            February 16, 2011

 43     A        1            December 17, 2010

 44     A        1            July 28, 2010
 44     B        1            August 10, 2010
 44     A        2            January 11, 2011
 44     B        2            January 28, 2011

 45     A        1            July 30, 2010
 45     B        1            August 9, 2010
 45     B        1            September 24, 2010
 45     A        2            April 5, 2011
 45     B        2            April 26, 2011

Я хочу сгенерировать еще один столбец с именем Cycle таким образом, чтобы для каждого C_ID он генерировал число, начинающееся с единицы, и увеличивало число от следующего C_rank = 'A' (как показано выше).

Я пытался использовать row_number, но безуспешно.

Может быть, какая-то опция цикла до следующего C_Rank = 'A' работает.

Как это можно сделать?

Ответы [ 4 ]

1 голос
/ 18 мая 2011

Вы можете посчитать количество предыдущих A в подзапросе:

select  *
,       (
        select  count(*)
        from    @YourTable yt2
        where   yt2.C_ID = yt1.C_ID
                and yt2.C_Rank = 'A'
                and yt2.Date <= yt1.Date
        ) as Cycle
from    @YourTable yt1
order by
        C_ID, Date

Пример в ODATA.

1 голос
/ 18 мая 2011

Вы должны быть в состоянии сделать это, используя ROW_NUMBER() и PARTITION BY

;WITH YourDataCTE AS
(
   SELECT
      C_ID, C_Rank, Date,
      ROW_NUMBER() OVER(PARTITION BY C_ID,C_Rank ORDER BY Date DESC) AS 'Cycle'
   FROM
      dbo.YourTable
)
SELECT *
FROM YourDataCTE

Делает ли это то, что вы ищете ??

Будет PARTITION BY C_ID,C_Rankзаставить ROW_NUMBER снова начинаться с 1 для каждого отдельного значения C_ID,C_Rank - я не знал, какое предложение ORDER BY в пределах одного раздела (единственное значение C_ID,C_Rank) вы ищете и только догадалисьэто может быть Date DESC (сначала самая новая дата).

0 голосов
/ 18 мая 2011

Ниже кода выполнить требование:

create table #Temp_Table
(
C_ID int
, C_Rank char(1)
, Date datetime
, NewColumn int
)

insert into #Temp_Table
(
C_ID
, C_Rank
, Date
)
select 42, ‘A’, ’10/14/2010′
union all
select 42, ‘B’, ’10/26/2010′
union all
select 42, ‘B’, ’10/14/2010′
union all
select 42, ‘C’, ’10/26/2010′
union all
select 42, ‘A’,’02/16/2011′
union all
select 43, ‘A’, ’12/17/2010′
union all
select 44, ‘A’, ’07/28/2010′
union all
select 44, ‘B’, ’08/10/2010′
union all
select 44, ‘A’, ’01/11/2011′
union all
select 44, ‘B’, ’01/28/2011′
union all
select 44, ‘C’, ’10/14/2010′
union all
select 44, ‘D’, ’10/26/2010′

Select ‘Original Data’ Comment
,*
from #Temp_Table

/*
This would be Actual Script to get the New ID based on information you provided
*/
Declare @Count int
,@C_ID int
,@C_Rank char(1)
,@total_Count int
,@Count_Partition int
,@Previous_ID int 

Declare @Table Table (ID int IDENTITY(1,1), C_ID int, C_Rank char(1), Date datetime, NewColumn int )

Set @Count = 1
Set @Count_Partition = 0

insert into @Table
Select *
from #Temp_Table 

Select @total_Count = ISNULL(MAX(ID),0)
from @Table

While @Count < = @total_Count
Begin
Select @C_ID = C_ID
,@C_Rank = C_Rank
From @Table
Where ID = @Count

If @Count = 1
Set @Previous_ID = @C_ID

If @Previous_ID != @C_ID
Set @Count_Partition = 1

Else If @C_Rank = 'A'
Set @Count_Partition = @Count_Partition + 1

update @Table
Set NewColumn = @Count_Partition
Where ID = @Count

Set @Previous_ID = @C_ID
Set @Count = @Count + 1
End 

Select C_ID
, C_Rank
, [Date]
, NewColumn
from @Table

–Drop table #Temp_Table 
0 голосов
/ 18 мая 2011

Выполните самостоятельное объединение для всех записей с тем же C_ID, предыдущей датой и C_Rank = 'A' и подсчитайте их.

select t1.C_ID, t1.C_Rank, count(t2.C_Rank) Cycle, t1.Date
from MyTable t1
  left join MyTable t2 on t1.C_ID=t2.C_ID
                      and t2.Date<=t1.Date
                      and t2.C_Rank='A'
group by t1.C_ID, t1.C_Rank, t1.Date
order by t1.C_ID, t1.Date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...