2016-04-11 26 views
0

yüzden aşağıdaki içeren bir tablo varsa:Güncelleme kendisinden tablo, ama sadece üst sonuç

Id INT 
EventDate DATETIME 
NextDate DATETIME 
UserId INT 

Aynı tablodan sonraki tarih değerini güncellemek ve tarihine NextDate değerini ayarlamak istediğiniz o kullanıcıyla ilgili sonraki giriş. Aşağıda

temel sorgu, ama ertesi var gibi etkili bir davranıyor, sen kendine bu tabloyu katılmak ya sahip

UPDATE 
EVENTS 
SET 
NextDate = n.EventDate 
FROM 
EVENTS AS n 
WHERE 
EVENTS.UserId = n.UserId 

cevap

2

I (2012+ SQL Server mevcuttur) lead() işlevini kullanırsınız birleşmeler, ilişkili alt sorgular veya apply.

+0

Bu işlevden haberdar değildim (SQL Server 2008 için kod yazıyordum), ancak bu görev için tam olarak tasarlanmış ve varsa yanıtım yerine kullanılmalıdır. https://msdn.microsoft.com/tr-tr/library/hh213125.aspx – vahanpwns

+1

Sql Server 2012 kullanıyorum, bu yüzden cevabı değiştirdim. – Jhorra

3

EventDate meydana gelen güncellemek için bunu nasıl söyleyeceğini emin değilim iki tabloda veya bir alt sorgudaki her kayıt için bir sonraki tarihi seçin. Sorgu muhtemelen böyle bir şey görünecektir: Bir süredir bir windows SQL sunucusu kullanmadıysanız gibi

UPDATE EVENTS 
SET e.NextDate = (
    SELECT TOP 1 n.EventDate 
    FROM EVENTS AS n 
    WHERE e.UserId = n.UserId 
    AND n.EventDate > e.EventDate 
    ORDER BY n.EventDate ASC) 
FROM EVENTS AS e 

Bu% 100 doğru olmayabilir. Temel fikir, aynı tabloya katılmanız dışında, tabloyu başka bir tabloya katmakla aynı şeydir.

fazla yardım için bu yanıta bakın:

with toupdate as (
     select e.*, 
      lead(eventdate) over (partition by userid order by eventdate) as next_eventdate 
     from e 
    ) 
update toupdate 
    set nextdate = next_eventdate; 

Not: Bu kullanarak alternatif yöntemlere göre çok daha verimli olmalıdır https://stackoverflow.com/a/14618713/1160540

+0

+1 Kendiliğinden birleştirmek için. Başka bir şey, bir SELECT deyiminde, her zaman TOP yan tümcesiyle bir ORDER BY yan tümcesi kullanın. Bu, hangi satırların TOP tarafından etkilendiğini tahmin etmenin tek yoludur. –

+0

@Ephraim Yazmaya başladığımda aklımda kalmıştı ama onu içeri almayı unuttum! Cevabımı güncelleyeceğim ... – vahanpwns

+1

Bu yaklaşımı düşünmemiştim, bu kolay! – Jhorra