2013-10-15 50 views
0

我有一個包含ID和TIMESTAMP的日誌表。我想先訂購ID然後TIMESTAMP。您如何訂購一組記錄,然後插入訂單?

例如,這是結果集會是什麼樣子:

12345 05:40 
12345 05:50 
12345 06:22 
12345 07:55 
12345 08:33 

一旦這樣做了,我想插入在表示它放置在組中,從最早到最晚的第三列訂單價值。

所以,你將有這樣的事情:

12345 05:40 1 <---First entry 
12345 05:50 2 
12345 06:22 3 
12345 07:55 4 
12345 08:33 5 <---Last entry 

我該怎麼做,在一個SQL語句?我可以選擇數據和ORDER BY ID,TIMESTAMP。但是,我似乎無法根據分組插入訂單值。 :(

回答

3

試試這個update不是一個insert

Fiddle demo here

;with cte as(
    select id, yourdate, row_number() over(order by id,yourdate) rn 
    from yourTable 
) 
Update ut Set thirdCol = rn 
From yourTable ut join cte on ut.Id = cte.id and ut.yourdate = cte.yourdate 

注:如果你需要得到每個ID基礎上更新了thirdColumn,請分割您ROWNUMBER通過使用row_number() over (partition by id, order by order by id,yourdate)

結果:

| ID | YOURDATE | THIRDCOL | 
|-------|----------|----------| 
| 12345 | 05:40 |  1 | 
| 12345 | 05:50 |  2 | 
| 12345 | 06:22 |  3 | 
| 12345 | 07:55 |  4 | 
| 12345 | 08:33 |  5 | 
+0

謝謝。 ROW_NUMBER()OVER()是我正在尋找的。 – Fastidious

1

使用派生表和更新。

IF OBJECT_ID('tempdb..#TableOne') IS NOT NULL 
begin 
     drop table #TableOne 
end 


CREATE TABLE #TableOne 
( 
SomeColumnA int , 
LetterOfAlphabet varchar(12) , 
PositionOrdinal int not null default 0 
) 




INSERT INTO #TableOne (SomeColumnA , LetterOfAlphabet) 
select 123 , 'x' 
union all select 123 , 'b' 
union all select 123 , 'z' 
union all select 123 , 't' 
union all select 123 , 'c' 
union all select 123 , 'd' 
union all select 123 , 'e' 
union all select 123 , 'a' 

Select 'pre' as SpaceTimeContinium , * from #TableOne order by LetterOfAlphabet 

Update 
#TableOne 
Set PositionOrdinal = derived1.rowid 
From 
(select SomeColumnA , LetterOfAlphabet , rowid = row_number() over (order by LetterOfAlphabet asc) from #TableOne innerT1 ) 
as derived1 
join #TableOne t1 
    on t1.LetterOfAlphabet = derived1.LetterOfAlphabet and t1.SomeColumnA = derived1.SomeColumnA 


Select 'post' as SpaceTimeContinium, * from #TableOne order by LetterOfAlphabet 


IF OBJECT_ID('tempdb..#TableOne') IS NOT NULL 
begin 
     drop table #TableOne 
end 
0

爲了拿到訂單,你的願望沒有做插入和更新,您可以設置您的聚集索引來處理它。下面的示例創建一個羣集主鍵。

要做到這一點,您必須刪除您已擁有的任何聚簇索引,因爲每個表只能有一個聚簇索引。

CREATE TABLE dbo.Table_1 
(
ID int NOT NULL, 
DTStamp datetime NOT NULL 
) 


ALTER TABLE dbo.Table_1 ADD CONSTRAINT 
PK_Table_1 PRIMARY KEY CLUSTERED 
(
ID, 
DTStamp 
) 

插入一些隨機數據與...

INSERT INTO [dbo].[Table_1]([ID],[DTStamp])VALUES(12346,getdate()); 
    INSERT INTO [dbo].[Table_1]([ID],[DTStamp])VALUES(12346,dateadd(mi,1,getdate())); 
    INSERT INTO [dbo].[Table_1]([ID],[DTStamp])VALUES(12346,dateadd(mi,2,getdate())); 
    INSERT INTO [dbo].[Table_1]([ID],[DTStamp])VALUES(12346,dateadd(mi,3,getdate())); 
    INSERT INTO [dbo].[Table_1]([ID],[DTStamp])VALUES(12346,dateadd(mi,4,getdate())); 
    INSERT INTO [dbo].[Table_1]([ID],[DTStamp])VALUES(12340,dateadd(mi,5,getdate())); 
    INSERT INTO [dbo].[Table_1]([ID],[DTStamp])VALUES(12340,dateadd(mi,6,getdate())); 
    INSERT INTO [dbo].[Table_1]([ID],[DTStamp])VALUES(12340,dateadd(mi,7,getdate())); 
    INSERT INTO [dbo].[Table_1]([ID],[DTStamp])VALUES(12340,dateadd(mi,8,getdate())); 
    INSERT INTO [dbo].[Table_1]([ID],[DTStamp])VALUES(12344,dateadd(mi,1,getdate())); 
    INSERT INTO [dbo].[Table_1]([ID],[DTStamp])VALUES(12344,dateadd(mi,2,getdate())); 
    INSERT INTO [dbo].[Table_1]([ID],[DTStamp])VALUES(12344,dateadd(mi,3,getdate())); 
    INSERT INTO [dbo].[Table_1]([ID],[DTStamp])VALUES(12344,dateadd(mi,4,getdate())); 
    INSERT INTO [dbo].[Table_1]([ID],[DTStamp])VALUES(12344,dateadd(mi,5,getdate())); 
    INSERT INTO [dbo].[Table_1]([ID],[DTStamp])VALUES(12344,dateadd(mi,6,getdate())); 
    INSERT INTO [dbo].[Table_1]([ID],[DTStamp])VALUES(12344,dateadd(mi,7,getdate())); 
    INSERT INTO [dbo].[Table_1]([ID],[DTStamp])VALUES(12344,dateadd(mi,8,getdate())); 

測試現在查詢您的表,並檢查了命令......

SELECT [ID] ,[DTStamp] FROM [Table_1] 

如果您需要的順序顯示在查詢中,可以使用over子句添加行號。

SELECT [ID] ,[DTStamp],row_number() over (partition by [ID] order by [ID] ,[DTStamp]) as SortOdr FROM [Table_1]