Hitung nilai sebelumnya di T-SQL (perbarui)

Saya sedikit kesulitan, belum lagi, banyak dengan beberapa logika SQL.

Contoh Kumpulan Data

wid  CCVnr  Amount  Reference  Seq  Month      ColumIwant=PreviousAmount
11   15946  20      50         1    1/1/2013   NULL
12   15946  20      50         2    1/2/2013   NULL
13   15946  20      50         3    1/3/2013   NULL
14   15946  20      50         4    1/4/2013   NULL
15   15946  20      50         5    1/5/2013   NULL
16   15946  20      50         6    1/6/2013   NULL
35   15946  20      50         1    1/1/2013   NULL
36   15946  10      50         2    1/2/2013   20
37   15946  10      50         3    1/3/2013   20
38   15946  10      50         4    1/4/2013   20
39   15946  10      50         5    1/5/2013   20
40   15946  10      50         6    1/6/2013   20
88   15946  10      50         1    1/1/2013   20
89   15946  20      50         2    1/2/2013   NULL
90   15946  25      50         3    1/3/2013   10
91   15946  25      50         4    1/4/2013   10
92   15946  25      50         5    1/5/2013   10
93   15946  25      50         6    1/6/2013   10

5 kolom pertama yang saya miliki, saya ingin 'menghitung' kolom terakhir: Jumlah Sebelumnya. Masalahnya bagi saya adalah setiap 6 bulan dimuat (ulang) sehingga tidak cukup hanya melihat nilai 'yang diubah', Anda juga harus memperhitungkan riwayat yang ada di sana.
(Saya pertama kali memiliki sepotong kode dengan CTE yang membandingkan satu baris dengan baris berikutnya tetapi seperti ini saya kehilangan riwayatnya...)

Situasi di sini adalah: klien memiliki jumlah yang ingin ia bayarkan per bulan yang dapat ia ubah: Dalam hal ini perubahannya dari 20 menjadi 10 menjadi 25.

Saya telah mengunggah file CSV atau kumpulan data yang sedang saya kerjakan di sini: https://mega.co.nz/#!oZhC0RxB!CzzMx3Yr6Kx1_1N9scuNqwJnqoZDGUXte47iOPkLG-E

Kami menggunakan SQL Server 2008 R2. Ada 20 juta baris seperti ini di tabel. Jadi mungkin kursor bukanlah pilihan terbaik(?)

Terima kasih banyak sebelumnya atas bantuannya!! L


PEMBARUAN: Saya menambahkan kolom wid karena kumpulan data asli juga memiliki kolom wid. @Mark Bannister Logikanya adalah dengan melihat 'Jumlah' dan kapan pada bulan tertentu Jumlahnya diubah oleh pengguna: * Semua bulan berikutnya diperbarui ketika 'Jumlah Baru' * Kami menghitung Jumlah Sebelumnya yang = Jumlah sebelumnya

@Love2Learn juga terima kasih atas komentar Anda. Ada lebih banyak kolom tetapi Anda harus tahu bahwa tidak mudah untuk menambahkan lebih banyak kolom di blok kode stackoverflow. Oleh karena itu saya juga mengunggah file CSV yang dapat Anda temukan tautannya. Kolom relevan yang saya tambahkan adalah 'wid'.

Biasanya harus ada cukup info dan kolom untuk menghitung baris sebelumnya. Terima kasih sebelumnya!


person laurens    schedule 04.04.2013    source sumber
comment
Apa logika untuk menentukan baris mana yang memiliki nilai sebelumnya? Apa kunci utama pada tabel?   -  person    schedule 04.04.2013
comment
Apakah keseluruhan skema tabel Anda hanya lima kolom itu???   -  person Eric J. Price    schedule 04.04.2013
comment
Harap sertakan informasi lebih lanjut. Tidak ada cara deterministik untuk menemukan baris sebelumnya dengan data yang Anda sertakan dalam pertanyaan.   -  person Aaron Bertrand    schedule 04.04.2013
comment
Sekali lagi terima kasih atas semua komentarnya, untuk info/kolom lebih lanjut saya tambahkan CSV dengan data sebenarnya! Kunci utama ditambahkan (wid)   -  person laurens    schedule 05.04.2013


Jawaban (1)


Anda memerlukan semacam nomor pelanggan -- untuk mengidentifikasi grup. Katakanlah ini custid:

select t.*,
       (select top 1 
               amount from t t2 where t2.custid = t.custid and t2.month < t.month order by t2.month
       ) as prevAmount
from t
person Gordon Linoff    schedule 04.04.2013
comment
Sekadar info, sepertinya Month adalah string, jadi < tidak akan berfungsi karena akan tertulis 1/2013 < 6/2012. - person Aaron Bertrand; 04.04.2013
comment
Maaf untuk tata letak contohnya...tidak sempurna. Tapi bulan adalah waktu. Saya akan mengubahnya menjadi tanggal demi kelengkapan. Terima kasih ‹br› plus: ini adalah notasi tanggal Perancis, 1/6/2013 adalah 2013/06/01; seperti yang kamu tahu ‹/br› - person laurens; 05.04.2013
comment
Mencoba kodenya, tidak yakin berfungsi seperti ini? Apakah akan berubah jika Anda menggunakan wid ? Terima kasih - person laurens; 05.04.2013