Author |
Topic |
AKP2008
Starting Member
45 Posts |
Posted - 2009-01-05 : 05:08:47
|
hi,I need to generate an incremental column.My table structure isVALIDFROM VALIDTO2008-01-23 00:00:00.000 2008-02-22 00:00:00.0002008-02-22 00:00:00.000 2008-03-23 00:00:00.0002008-03-23 00:00:00.000 2008-04-23 00:00:00.0002008-06-23 00:00:00.000 2008-08-13 00:00:00.0002008-08-13 00:00:00.000 2008-08-24 00:00:00.0002008-08-24 00:00:00.000 2008-09-15 00:00:00.0002008-10-1 00:00:00.000 2008-12-20 00:00:00.000I need an incremental column by comparing validfrom and validto of previous row.My output should be like this.VALIDFROM VALIDTO Column12008-01-23 00:00:00.000 2008-02-22 00:00:00.000 12008-02-22 00:00:00.000 2008-03-23 00:00:00.000 12008-03-23 00:00:00.000 2008-04-23 00:00:00.000 12008-06-23 00:00:00.000 2008-08-13 00:00:00.000 22008-08-13 00:00:00.000 2008-08-24 00:00:00.000 22008-08-24 00:00:00.000 2008-09-15 00:00:00.000 22008-10-1 00:00:00.000 2008-12-20 00:00:00.000 3Please help me to get this.Thanks. |
|
bklr
Master Smack Fu Yak Hacker
1693 Posts |
Posted - 2009-01-05 : 05:12:03
|
use datediff(m,col1,col2) for this |
 |
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
|
visakh16
Very Important crosS Applying yaK Herder
52326 Posts |
Posted - 2009-01-05 : 05:32:27
|
[code]CREATE TABLE #Temp(VALIDFROM datetime,VALIDTO datetime,Seq int)INSERT INTO #Temp (VALIDFROM,VALIDTO)SELECT '2008-01-23 00:00:00.000','2008-02-22 00:00:00.000' UNION ALLSELECT '2008-02-22 00:00:00.000', '2008-03-23 00:00:00.000' UNION ALLSELECT '2008-03-23 00:00:00.000', '2008-04-23 00:00:00.000' UNION ALLSELECT '2008-06-23 00:00:00.000', '2008-08-13 00:00:00.000' UNION ALLSELECT '2008-08-13 00:00:00.000', '2008-08-24 00:00:00.000' UNION ALLSELECT '2008-08-24 00:00:00.000', '2008-09-15 00:00:00.000' UNION ALLSELECT '2008-10-1 00:00:00.000', '2008-12-20 00:00:00.000' UNION ALLSELECT '2008-10-15 00:00:00.000', '2008-10-18 00:00:00.000' UNION ALLSELECT '2008-10-18 00:00:00.000', '2008-12-22 00:00:00.000' UNION ALLSELECT '2008-11-19 00:00:00.000', '2008-12-20 00:00:00.000' UNION ALLSELECT '2008-12-20 00:00:00.000', '2008-12-30 00:00:00.000' UNION ALLSELECT '2008-12-30 00:00:00.000', '2009-01-12 00:00:00.000' UNION ALLSELECT '2009-01-12 00:00:00.000', '2009-01-20 00:00:00.000' CREATE CLUSTERED INDEX IDX ON #Temp(VALIDFROM,VALIDTO)UPDATE #Temp SET Seq=0DECLARE @ValidTo datetime,@ValidFrom datetime,@Seq intSELECT TOP 1 @ValidTo=VALIDTO,@ValidFrom=VALIDFROM,@Seq=SEQFROM #TempORDER BY VALIDFROMUPDATE #TempSET @Seq=SEQ=CASE WHEN VALIDFROM=@ValidTo THEN @Seq ELSE @Seq+1 END,@ValidFrom=VALIDFROM,@ValidTo=VALIDTOselect * from #Tempdrop table #Tempoutput----------------------------------------------------------------VALIDFROM VALIDTO Seq2008-01-23 00:00:00.000 2008-02-22 00:00:00.000 12008-02-22 00:00:00.000 2008-03-23 00:00:00.000 12008-03-23 00:00:00.000 2008-04-23 00:00:00.000 12008-06-23 00:00:00.000 2008-08-13 00:00:00.000 22008-08-13 00:00:00.000 2008-08-24 00:00:00.000 22008-08-24 00:00:00.000 2008-09-15 00:00:00.000 22008-10-01 00:00:00.000 2008-12-20 00:00:00.000 32008-10-15 00:00:00.000 2008-10-18 00:00:00.000 42008-10-18 00:00:00.000 2008-12-22 00:00:00.000 42008-11-19 00:00:00.000 2008-12-20 00:00:00.000 52008-12-20 00:00:00.000 2008-12-30 00:00:00.000 52008-12-30 00:00:00.000 2009-01-12 00:00:00.000 52009-01-12 00:00:00.000 2009-01-20 00:00:00.000 5[/code] |
 |
|
AKP2008
Starting Member
45 Posts |
Posted - 2009-01-05 : 05:35:24
|
quote: Originally posted by Peso datediff(month, validfrom, validto) See here how DATEDIFF function works http://www.sqlteam.com/article/datediff-function-demystified E 12°55'05.63"N 56°04'39.26"
Hi,Thanks for Your quick response.But i don't want to get the datediff. I need to generate an incremental column.For exampleFirst value should be defalutly 1.second value is getting by comparing validfrom at second row with validto at firstrow if they are equal then 1 else 2.Then compare validfrom at third row with validto at second row if they are equal same as previous value else previousvalue + 1.Like this i want to generate.Thanks. |
 |
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2009-01-05 : 05:37:50
|
quote: Originally posted by AKP2008 I need an incremental column by comparing validfrom and validto of previous row.My output should be like this.VALIDFROM VALIDTO Column12008-01-23 2008-02-22 12008-02-22 2008-03-23 12008-03-23 2008-04-23 12008-06-23 2008-08-13 22008-08-13 2008-08-24 22008-08-24 2008-09-15 22008-10-01 2008-12-20 3
Which is it?Your sample data output describes when you compare validto with previous validto, nothing else.If you want validfrom compared to previous validto, your expected column1 should be this, right?VALIDFROM VALIDTO Column12008-01-23 2008-02-22 NULL2008-02-22 2008-03-23 02008-03-23 2008-04-23 02008-06-23 2008-08-13 22008-08-13 2008-08-24 02008-08-24 2008-09-15 02008-10-01 2008-12-20 1 If you can't present what you want, how do you expect us to help you? E 12°55'05.63"N 56°04'39.26" |
 |
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
|
bklr
Master Smack Fu Yak Hacker
1693 Posts |
Posted - 2009-01-05 : 05:46:16
|
select identity(int,1,1)as id, * into #temp from urtableselect validfrom ,validto ,case when validto = (select validfrom from #temp where id = v.id + 1) then 1 else 0 end as col1from #temp v |
 |
|
AKP2008
Starting Member
45 Posts |
Posted - 2009-01-05 : 05:50:08
|
quote: Originally posted by visakh16
CREATE TABLE #Temp(VALIDFROM datetime,VALIDTO datetime,Seq int)INSERT INTO #Temp (VALIDFROM,VALIDTO)SELECT '2008-01-23 00:00:00.000','2008-02-22 00:00:00.000' UNION ALLSELECT '2008-02-22 00:00:00.000', '2008-03-23 00:00:00.000' UNION ALLSELECT '2008-03-23 00:00:00.000', '2008-04-23 00:00:00.000' UNION ALLSELECT '2008-06-23 00:00:00.000', '2008-08-13 00:00:00.000' UNION ALLSELECT '2008-08-13 00:00:00.000', '2008-08-24 00:00:00.000' UNION ALLSELECT '2008-08-24 00:00:00.000', '2008-09-15 00:00:00.000' UNION ALLSELECT '2008-10-1 00:00:00.000', '2008-12-20 00:00:00.000' UNION ALLSELECT '2008-10-15 00:00:00.000', '2008-10-18 00:00:00.000' UNION ALLSELECT '2008-10-18 00:00:00.000', '2008-12-22 00:00:00.000' UNION ALLSELECT '2008-11-19 00:00:00.000', '2008-12-20 00:00:00.000' UNION ALLSELECT '2008-12-20 00:00:00.000', '2008-12-30 00:00:00.000' UNION ALLSELECT '2008-12-30 00:00:00.000', '2009-01-12 00:00:00.000' UNION ALLSELECT '2009-01-12 00:00:00.000', '2009-01-20 00:00:00.000' CREATE CLUSTERED INDEX IDX ON #Temp(VALIDFROM,VALIDTO)UPDATE #Temp SET Seq=0DECLARE @ValidTo datetime,@ValidFrom datetime,@Seq intSELECT TOP 1 @ValidTo=VALIDTO,@ValidFrom=VALIDFROM,@Seq=SEQFROM #TempORDER BY VALIDFROMUPDATE #TempSET @Seq=SEQ=CASE WHEN VALIDFROM=@ValidTo THEN @Seq ELSE @Seq+1 END,@ValidFrom=VALIDFROM,@ValidTo=VALIDTOselect * from #Tempdrop table #Tempoutput----------------------------------------------------------------VALIDFROM VALIDTO Seq2008-01-23 00:00:00.000 2008-02-22 00:00:00.000 12008-02-22 00:00:00.000 2008-03-23 00:00:00.000 12008-03-23 00:00:00.000 2008-04-23 00:00:00.000 12008-06-23 00:00:00.000 2008-08-13 00:00:00.000 22008-08-13 00:00:00.000 2008-08-24 00:00:00.000 22008-08-24 00:00:00.000 2008-09-15 00:00:00.000 22008-10-01 00:00:00.000 2008-12-20 00:00:00.000 32008-10-15 00:00:00.000 2008-10-18 00:00:00.000 42008-10-18 00:00:00.000 2008-12-22 00:00:00.000 42008-11-19 00:00:00.000 2008-12-20 00:00:00.000 52008-12-20 00:00:00.000 2008-12-30 00:00:00.000 52008-12-30 00:00:00.000 2009-01-12 00:00:00.000 52009-01-12 00:00:00.000 2009-01-20 00:00:00.000 5
Hi,Thanks for your solution visakh. It works perfectly.Is it possible to get this with single select statement. Please let me know.Thanks. |
 |
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2009-01-05 : 05:57:14
|
Yes you can get that in a single statement but performance will suck for a reasonable large amount of records. E 12°55'05.63"N 56°04'39.26" |
 |
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2009-01-05 : 06:03:32
|
Are you using SQL Server 2005 or SQL Server 2000? E 12°55'05.63"N 56°04'39.26" |
 |
|
AKP2008
Starting Member
45 Posts |
Posted - 2009-01-05 : 06:48:04
|
quote: Originally posted by Peso Are you using SQL Server 2005 or SQL Server 2000? E 12°55'05.63"N 56°04'39.26"
I am using SQL Server 2005. |
 |
|
|