Saya ingin menulis kueri seperti ini:
SELECT o.OrderId, MAX(o.NegotiatedPrice, o.SuggestedPrice)
FROM Order o
Tapi ini bukan bagaimana MAX
fungsinya bekerja, kan? Ini adalah fungsi agregat sehingga mengharapkan satu parameter dan kemudian mengembalikan MAX dari semua baris.
Adakah yang tahu cara melakukannya dengan cara saya?
sql
sql-server
max
skb
sumber
sumber
GREATEST
fungsi; SQLite mengemulasi dukungan dengan memungkinkan beberapa kolom dalamMAX
agregat.Jawaban:
Anda perlu membuat
User-Defined Function
jika Anda ingin memiliki sintaksis yang mirip dengan contoh Anda, tetapi bisakah Anda melakukan apa yang ingin Anda lakukan, sebaris, dengan cukup mudah denganCASE
pernyataan, seperti yang dikatakan orang lain.The
UDF
bisa menjadi sesuatu seperti ini:... dan Anda akan menyebutnya seperti itu ...
sumber
Jika Anda menggunakan SQL Server 2008 (atau lebih tinggi), maka ini adalah solusi yang lebih baik:
Semua kredit dan suara harus masuk ke jawaban Sven untuk pertanyaan terkait, "SQL MAX dari banyak kolom?"
Saya mengatakan itu adalah " jawaban terbaik " karena:
SELECT MAX (a), MAX (b) FROM (VALUES (1, 2), (3, 4), (5, 6), (5, 6), (7, 8), (9, 10)) SEBAGAI MyTable (a, b)
sumber
Dapat dilakukan dalam satu baris:
Sunting: Jika Anda berurusan dengan angka yang sangat besar, Anda harus mengubah variabel nilai menjadi bigint untuk menghindari overflow integer.
sumber
Saya kira tidak. Saya menginginkan ini tempo hari. Yang paling dekat yang saya dapatkan adalah:
sumber
Mengapa tidak mencoba fungsi IIF (memerlukan SQL Server 2012 dan yang lebih baru)
Itu dia.
(Petunjuk: berhati-hatilah terhadap keduanya
null
, karena hasilnyaa>b
akan salah setiap kali nol. Jadib
akan menjadi hasil dalam kasus ini)sumber
NULL
, hasilnya akan selalu menjadi yang kedua.NULL > 1234
pernyataan salahIIF(a>b, a, COALESCE(b,a))
untuk memberikan nilai ketika hanya ada satusumber
Jawaban lainnya bagus, tetapi jika Anda harus khawatir memiliki nilai NULL, Anda mungkin menginginkan varian ini:
sumber
Di SQL Server 2012 atau lebih tinggi, Anda bisa menggunakan kombinasi dari
IIF
danISNULL
(atauCOALESCE
) untuk mendapatkan maksimum 2 nilai.Bahkan ketika 1 dari mereka adalah NULL.
Atau jika Anda ingin mengembalikan 0 ketika keduanya NULL
Cuplikan contoh:
Hasil:
Tetapi jika seseorang perlu SUM beberapa nilai?
Kemudian saya sarankan untuk SALIN BERLAKU ke agregasi dari NILAI.
Ini juga memiliki manfaat bahwa ini dapat menghitung hal-hal lain pada saat yang bersamaan.
Contoh:
sumber
Sub Kueri dapat mengakses kolom dari kueri Luar sehingga Anda dapat menggunakan pendekatan ini untuk menggunakan agregat seperti
MAX
lintas kolom. (Mungkin lebih bermanfaat ketika ada lebih banyak kolom yang terlibat)sumber
VALUES
sintaksisnya lebih bagus.SQL Server 2012 memperkenalkan
IIF
:Menangani NULL disarankan saat menggunakan
IIF
, karena aNULL
di kedua sisi Andaboolean_expression
akan menyebabkanIIF
pengembalianfalse_value
(sebagai lawan dariNULL
).sumber
Saya akan pergi dengan solusi yang disediakan oleh kcrumley Hanya memodifikasinya sedikit untuk menangani NULLs
EDIT Dimodifikasi setelah komentar dari Mark . Seperti yang ditunjukkannya dengan benar dalam 3 logika bernilai x> NULL atau x <NULL harus selalu mengembalikan NULL. Dengan kata lain hasil yang tidak diketahui.
sumber
Sesederhana ini:
sumber
sumber
Ups, saya baru saja mengirim duplikat dari pertanyaan ini ...
Jawabannya adalah, tidak ada fungsi bawaan seperti Oracle's Greatest , tetapi Anda dapat mencapai hasil yang sama untuk 2 kolom dengan UDF, perhatikan, penggunaan sql_variant cukup penting di sini.
kristof
Diposting jawaban ini:
sumber
Berikut adalah contoh kasus yang harus menangani nulls dan akan bekerja dengan versi MSSQL yang lebih lama. Ini didasarkan pada fungsi sebaris di salah satu contoh populer:
sumber
Saya mungkin tidak akan melakukannya dengan cara ini, karena ini kurang efisien daripada konstruksi KASUS yang telah disebutkan - kecuali, mungkin, Anda memiliki mencakup indeks untuk kedua pertanyaan. Apa pun itu, ini adalah teknik yang berguna untuk masalah serupa:
sumber
Untuk jawaban di atas mengenai jumlah besar, Anda bisa melakukan perkalian sebelum penambahan / pengurangan. Ini agak bulkier tetapi tidak membutuhkan gips. (Saya tidak bisa berbicara untuk kecepatan tetapi saya menganggap itu masih cukup cepat)
Perubahan menjadi
setidaknya alternatif jika Anda ingin menghindari casting.
sumber
Ini adalah versi IIF dengan penanganan NULL (berdasarkan jawaban Xin):
Logikanya adalah sebagai berikut, jika salah satu dari nilai adalah NULL, kembalikan yang bukan NULL (jika keduanya NULL, NULL dikembalikan). Kalau tidak, kembalikan yang lebih besar.
Hal yang sama dapat dilakukan untuk MIN.
sumber
Anda dapat melakukan sesuatu seperti ini:
sumber
sumber
sumber
Dalam bentuknya yang paling sederhana ...
sumber
Untuk SQL Server 2012:
sumber
Inilah jawaban @Scott Langham dengan penanganan NULL yang sederhana:
sumber
sumber
sumber
VALUES
inline seperti itu menarik, saya tidak yakin ini lebih sederhana dariCASE
atauIFF
. Saya akan tertarik untuk melihat bagaimana kinerja solusi ini melawan opsi lainMemperluas jawaban Xin dan menganggap tipe nilai perbandingannya adalah INT, pendekatan ini juga berfungsi:
Ini adalah tes lengkap dengan nilai contoh:
sumber
Di MemSQL lakukan hal berikut:
sumber
Di Presto Anda bisa menggunakan digunakan
sumber