Bagaimana Anda mengembalikan 1 nilai per baris maks dari beberapa kolom:
TableName
[Number, Date1, Date2, Date3, Cost]
Saya perlu mengembalikan sesuatu seperti ini:
[Number, Most_Recent_Date, Cost]
Pertanyaan?
sql
sql-server
tsql
BenB
sumber
sumber
WHEN Date1 > Date2 AND Date1 > Date3 THEN Date1; WHEN Date2 > Date3 THEN Date3; ELSE Date3
?Berikut ini adalah solusi bagus untuk
Max
fungsionalitas menggunakan T-SQL dan SQL Serversumber
Jika Anda menggunakan MySQL, Anda bisa menggunakan
sumber
Ada 3 metode lagi di mana
UNPIVOT
(1) adalah yang tercepat sejauh ini, diikuti oleh Simulated Unpivot (3) yang jauh lebih lambat daripada (1) tetapi masih lebih cepat dari (2)Solusi 1 (
UNPIVOT
)Solusi 2 (Sub query per baris)
Solusi 3 (Simulasi
UNPIVOT
)sumber
Salah satu dari dua sampel di bawah ini akan berfungsi:
Yang kedua adalah add-on untuk jawaban lassevk .
sumber
Untuk T-SQL (MSSQL 2008+)
sumber
sumber
Fungsi skalar menyebabkan segala macam masalah kinerja, jadi lebih baik untuk membungkus logika menjadi Fungsi Inline Table Valued jika memungkinkan. Ini adalah fungsi yang saya gunakan untuk mengganti beberapa Fungsi yang Ditentukan Pengguna yang memilih tanggal Min / Max dari daftar hingga sepuluh tanggal. Ketika diuji pada dataset saya dari 1 Juta baris, Fungsi Skalar memakan waktu lebih dari 15 menit sebelum saya membunuh permintaan, Inline TVF membutuhkan 1 menit yang merupakan jumlah waktu yang sama dengan memilih resultset ke dalam tabel sementara. Untuk menggunakan fungsi panggilan ini baik dari subquery di SELECT atau CROSS APPLY.
sumber
Ini sedikit lebih mudah untuk dituliskan dan dilewati langkah-langkah evaluasi karena pernyataan kasus dievaluasi secara berurutan.
sumber
Sayangnya jawaban Lasse , meskipun tampak jelas, memiliki kelemahan yang sangat penting. Itu tidak bisa menangani nilai NULL. Nilai NULL tunggal menghasilkan Date1 yang dikembalikan. Sayangnya setiap upaya untuk memperbaiki masalah itu cenderung menjadi sangat berantakan dan tidak skala ke 4 atau lebih nilai dengan sangat baik.
jawaban pertama databyss tampak (dan) bagus. Namun, tidak jelas apakah jawabannya akan dengan mudah mengekstrapolasi ke 3 nilai dari multi-tabel bergabung bukan 3 nilai sederhana dari satu tabel. Saya ingin menghindari mengubah query seperti itu menjadi sub-query hanya untuk mendapatkan maks 3 kolom, juga saya cukup yakin ide bagus databyss bisa dibersihkan sedikit.
Jadi tanpa basa-basi lagi, inilah solusi saya (berasal dari ide databyss).
Ini menggunakan cross-joins memilih konstanta untuk mensimulasikan efek multi-table join. Yang penting untuk dicatat adalah bahwa semua alias yang diperlukan dijalankan dengan benar (yang tidak selalu terjadi) dan ini membuat polanya cukup sederhana dan cukup skalabel melalui kolom tambahan.
sumber
Masalah: pilih nilai tarif minimum yang diberikan ke entitas Persyaratan: Tarif agensi bisa nol
Terinspirasi oleh jawaban ini dari Nat
sumber
Jika Anda menggunakan SQL Server 2005, Anda dapat menggunakan fitur UNPIVOT. Ini adalah contoh lengkapnya:
sumber
Menggunakan CROSS APPLY (untuk 2005+) ....
sumber
Dari SQL Server 2012 kita bisa menggunakan IIF .
sumber
DECLARE @Date1 DATE='2014-08-01'; DECLARE @Date2 DATE=null; DECLARE @Date3 DATE='2014-07-05'; /*this gets returned*/
select IIF(@Date1 > @Date2 or @Date2 is null, IIF(@Date1 > @Date3 or @Date3 is null, @Date1, @Date3), IIF(@Date2 > @Date3 or @Date3 is null, @Date2, @Date3)) as MostRecentDate
Silakan coba menggunakan
UNPIVOT
:sumber
Saya lebih suka solusi berdasarkan kasus-kapan, asumsi saya adalah bahwa itu harus memiliki dampak paling kecil pada penurunan kinerja yang mungkin dibandingkan dengan solusi lain yang mungkin seperti yang berlaku silang, nilai (), fungsi kustom dll.
Ini adalah versi case-when yang menangani nilai null dengan sebagian besar kasus uji yang mungkin:
dan hasilnya adalah:
sumber
Anda dapat membuat fungsi di mana Anda melewati tanggal dan kemudian menambahkan fungsi ke pernyataan pilih seperti di bawah ini. pilih Nomor, dbo.fxMost_Recent_Date (Date1, Date2, Date3), Biaya
(@ Date1 smalldatetime, @ Date2 smalldatetime, @ Date3 smalldatetime) RETURNS smalldatetime AS BEGIN DECLARE @Result smalldatetime
AKHIR
sumber
Berdasarkan solusi ScottPletcher dari http://www.experts-exchange.com/Microsoft/Development/MS-SQL-Server/Q_24204894.html Saya telah membuat serangkaian fungsi (mis. GetMaxOfDates3, GetMaxOfDates13) untuk menemukan maks hingga 13 Nilai tanggal menggunakan UNION ALL. Lihat fungsi T-SQL untuk mendapatkan nilai maksimum dari baris yang sama. Namun saya belum mempertimbangkan solusi UNPIVOT pada saat penulisan fungsi-fungsi ini.
sumber
Cara lain untuk menggunakan KASUS KETIKA
sumber
Tabel di atas adalah tabel gaji karyawan dengan gaji1, gaji2, gaji3, gaji4 sebagai kolom. Pertanyaan di bawah ini akan mengembalikan nilai maksimal dari empat kolom
Menjalankan kueri di atas akan memberikan output sebagai terbesar_val (10001)
Logika kueri di atas adalah sebagai berikut:
output akan menjadi 10001
sumber
ini solusi yang bagus:
sumber
Saya tidak tahu apakah itu di SQL, dll ... di M $ ACCESS membantu ada fungsi yang disebut
MAXA(Value1;Value2;...)
yang seharusnya dilakukan.Semoga bisa membantu seseorang.
PD: Nilai bisa berupa kolom atau yang dihitung, dll.
sumber
MAXA
adalah fungsi Excel , bukan Access.