MySQL

2011-09-10 9 views
6

'daki satır tarihleri ​​arasındaki farkı seçin Aynı tablodaki farklı satırlar arasındaki benzersiz tarih alanlarında farkı hesaplamak istiyorum.MySQL

id | date 
    ---+------------ 
    1 | 2011-01-01 
    2 | 2011-01-02 
    3 | 2011-01-15 
    4 | 2011-01-20 
    5 | 2011-01-10 
    6 | 2011-01-30 
    7 | 2011-01-03 

aşağıdaki üreten bir sorgu oluşturmak istiyorum: Aşağıdaki veriler verilen Örneğin

, ben MySQL kullanmak ne tarih fonksiyonları için

id | date  | days_since_last 
---+------------+----------------- 
1 | 2011-01-01 | 
2 | 2011-01-02 | 1 
7 | 2011-01-03 | 1 
5 | 2011-01-10 | 7 
3 | 2011-01-15 | 5 
4 | 2011-01-20 | 5 
6 | 2011-01-30 | 10 

Herhangi önerileri, ya da bunu yapacak bir alt seçim var mı?

(Tabii ki, ben ilk satırı görmezden WHERE date > '2011-01-01' koyarak sakıncası yoktur.)

+0

Bu ... –

cevap

2

: MySQL desteği analitiği, KURŞUN & LAG spesifik olmak bu güzel olur nerede

SELECT 
    id, 
    date, 
    DATEDIFF(
    (SELECT MAX(date) FROM atable WHERE date < t.date), 
    date 
) AS days_since_last 
FROM atable AS t 
+0

Bu işe yarar, iyi olur, ama iç içe geçmiş yüzünden bok gibi davranır. alt sorgu ("n" tablo taramaları yapacaksınız). En iyi yol, bir tarihe göre sipariş verildikten sonra önceki satırın tarih değerini saklamak için bir değişken kullanmak ve sadece bir geçiş yapmaktır. Şu anda rahatsız edilemiyorum, ama eğer gitmek istiyorsan ... :) – Bohemian

+0

Bu aradığım şeyi düşündüm, ama Bohemian'ın söylediği gibi, performans acıtıyor. Tamamlanması 28 dakika sürdü (yaklaşık 26.000 satır). Bunu sorduğum soruya en iyi cevap olarak seçiyorum, ama akıl hocalığı için geçici tabloları kullanmak ve Krtek'in cevabını takip etmek en iyisi olabilir. –

+0

@Mike S .: İki şey tarafından şaşırdım. İlk olarak, böyle küçük bir masada çok kötü performans gösterdiğini şaşırdım. Lütfen beni yanlış anlamayın, bu çözümün en hızlısı olabileceğini, hatta ortalamanın oldukça altında olabileceğini, ancak 26.000 satırda 28 dakika olabileceğini fark ettim ... Tabloda tarihin bir indeksi yokmuş olabilir mi? '? Her neyse, beni şaşırtan başka bir şey, bu cevabı ilk sırada seçtiniz. :) Demek istediğim minnettarım, teşekkürler, ama inanın ki, kendi sözlerime dayanarak artık kendim Krtek'in cevabını 'doğru' çözüme daha yakın buluyorum, sonunda ne olursa olsun. –

0
böyle

şey çalışması gerekir:

SELECT mytable.id, mytable.date, DATEDIFF(mytable.date, t2.date) 
FROM mytable 
LEFT JOIN mytable AS t2 ON t2.id = table.id - 1 

Ancak, bu id sürekli olduğu anlamına senin tablo, aksi halde bu işe yaramaz. Ve belki de t2.datenull'dan itibaren ilk satır için MySQL'den şikayetçi olacak, ancak şimdi kontrol etme vaktim yok. Bir bağıntılı alt sorgu yardımcı olabilir

+0

Beni cevap yendi, bu yüzden Sadece parçamı ekleyeceğim ve belgelere bir göz atmasını önereceğim: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_datediff – Tchami

+0

@Krtek, teşekkürler Hızlı yanıt için. Durumu kronolojik sırada olmadığından durumu daha iyi yansıtmak için soruyu güncellemeliyim. –

+0

@Tchami - güven oylaması için teşekkürler. ;) emin olun, belgelerin nerede olduğunu biliyorum ve sık sık danışın. –