Ini terasa seperti itu harus mudah. Bagaimana cara mendapatkan tanggal terbaru yang ada di kolom yang berbeda
DROP TABLE #indebtedness
CREATE TABLE #indebtedness (call_case CHAR(10), date1 DATETIME, date2 DATETIME, date3 DATETIME)
INSERT #indebtedness VALUES ('Key1', '2019-10-30', '2019-11-30', '2019-10-25')
INSERT #indebtedness VALUES ('Key2', '2019-10-20', '2019-10-30', '2019-10-15')
INSERT #indebtedness VALUES ('Key3', '2019-11-11', '2019-10-29', '2019-10-30')
INSERT #indebtedness VALUES ('Key4', null , '2019-10-29', '2019-10-13')
select call_case, ?? AS 'Latest Date' from #indebtedness
Saya ingin hasilnya:
call_case Latest Date
Key1 2019-11-30
Key2 2019-10-30
Key3 2019-11-11
Key4 2019-10-29
sql
sql-server
datetime
Ahmed Alkhteeb
sumber
sumber
NULL
.MAX
menggunakan sajaGROUP BY
. Jadi jawaban saya untuk pertanyaan Anda adalah "tidak akan diperbaiki," karena saya pikir mungkin desain database Anda perlu diubah.call_case
) dan cap waktu. Bukan satu meja dengan 50 kolomJawaban yang saat ini diterima adalah jawaban terbaik, tetapi saya pikir itu tidak cukup baik untuk menjelaskan alasannya. Sekilas jawaban lain tampak jauh lebih bersih (yang ingin menulis pernyataan kasus yang jelek), tetapi kemungkinan akan jauh lebih buruk ketika Anda mulai beroperasi pada skala.
Inilah cara saya mengatur semuanya
Di sistem saya ini membuat saya 12.872.738 baris dalam tabel. Jika saya mencoba setiap pertanyaan di atas (tweaked to
SELECT INTO
jadi saya tidak perlu menunggu sampai selesai mencetak hasil dalam SSMS), saya mendapatkan hasil berikut:Jika Anda melihat rencana kueri, menjadi sangat jelas mengapa - menambahkan segala jenis unpivot atau agregat (atau surga dilarang
STRING_SPLIT
) Anda akan berakhir dengan semua jenis operator tambahan yang tidak Anda butuhkan (dan itu memaksa rencana untuk pergi paralel, mengambil sumber daya pertanyaan lain mungkin ingin). Dengan kontrak,CASE
solusi berbasis tidak berjalan paralel, berjalan sangat cepat, dan sangat sederhana.Dalam hal ini, kecuali Anda memiliki sumber daya tidak terbatas (Anda tidak memiliki), Anda harus memilih pendekatan yang paling sederhana dan tercepat.
Ada pertanyaan tentang apa yang harus dilakukan jika Anda perlu terus menambahkan kolom baru dan memperluas pernyataan kasus. Ya, ini menjadi sulit, tetapi begitu juga setiap solusi lainnya. Jika ini sebenarnya alur kerja yang masuk akal, maka Anda harus mendesain ulang tabel Anda. Apa yang Anda inginkan mungkin terlihat seperti ini:
Ini tentu saja tidak bebas dari masalah kinerja potensial, dan akan membutuhkan penyetelan indeks yang cermat, tetapi merupakan cara terbaik untuk menangani sejumlah cap waktu potensial yang sewenang-wenang
Jika ada jawaban yang dihapus, berikut adalah versi yang saya bandingkan (agar)
sumber
Coba ini:
sumber
NULL
s, harus memiliki kinerja yang baik, dan mudah digeneralisasikan ke lebih banyak kolom.SQL FIDDLE
Menggunakan
MAX()
Menggunakan
CASE
sumber
VALUES
jauh lebih scalable daripadaCASE
ekspresi yang besar . Saya juga ingin belajar mengapa itu dibatalkan, karena pemilih tampaknya percaya ada masalah dengan SQL, dan karena itu jika mereka memberi tahu kami masalah itu, kita semua bisa belajar darinya.Dalam pandangan saya, Pivot adalah opsi terbaik dan efisien untuk kueri ini. Salin dan Tempel di MS SQL SERVER. Silakan periksa kode yang ditulis di bawah ini:
sumber
Ini benar-benar harus dievaluasi kembali pada tingkat desain seperti yang telah ditunjukkan orang lain. Di bawah ini adalah contoh dari desain yang berbeda menggunakan dua tabel untuk lebih menyelesaikan apa yang tampaknya Anda cari dalam hasil Anda. Ini akan membuat pertumbuhan jauh lebih menguntungkan.
Berikut ini sebuah contoh (nama tabel yang berbeda digunakan):
Ini memungkinkan lebih banyak jenis case untuk ditambahkan, lebih banyak entri log yang akan ditambahkan dan memberikan desain yang lebih baik.
Ini hanya contoh untuk tujuan pembelajaran.
sumber