Pilih maks dari kolom terhitung di samping kolom lainnya

Saya memiliki tabel yang memiliki kolom ID, FIELD1, FIELD2, semuanya bertipe NUMBER.

Saya ingin mencari MAX suatu fungsi di FIELD1 dan FIELD2, dan menampilkannya di samping ID.

saya coba

SELECT ID, MAX(SQRT(FIELD1 + FIELD2)) AS CALC
FROM TABLE;

Tapi itu mengembalikan ORA-00937: not a single-group group function.

Saya mencoba solusinya di utas ini , tetapi mereka memiliki kesalahannya sendiri.

SELECT * FROM (
    SELECT ID, SQRT(FIELD1 + FIELD2) AS CALC,
    RANK() OVER (ORDER BY CALC DESC) AS RANKING
    FROM TABLE
)
WHERE RANKING = 1;

memberikan kesalahan

ORA-06553: PLS-306: wrong number or types of arguments in call to
'OGC_CALC'

dan begitu juga

SELECT ID, SQRT(FIELD1 + FIELD2) AS CALC
FROM TABLE
WHERE CALC = (
    SELECT MAX(CALC)
    FROM TABLE
);

Menggunakan Oracle Database 11g Express Edition Rilis 11.2.0.2.0.

Bagaimana saya bisa membuat ini berfungsi? Terima kasih.


person Jim Cullen    schedule 24.10.2016    source sumber


Jawaban (2)


Bisakah Anda mencoba dua pertanyaan di bawah ini.

SELECT ID,FIELD1,FIELD2,SQRT(FIELD1 + FIELD2) AS CALC
FROM   TABLE WHERE SQRT(FIELD1 + FIELD2)= (SELECT MAX(SQRT(FIELD1 + FIELD2)) FROM TABLE);

Atau, Disarankan oleh Aleksej tanpa menggunakan agregat atau mengelompokkan berdasarkan fungsi.

SELECT *
FROM (
        SELECT ID, 
               SQRT(FIELD1 + FIELD2)
        FROM TABLE
        ORDER BY 2 DESC
        )
    WHERE ROWNUM=1;

Permintaan awal,

SELECT *
FROM (
    SELECT ID, 
           MAX(SQRT(FIELD1 + FIELD2)) AS CALC
    FROM TABLE
    GROUP BY ID
    ORDER BY 2 DESC
    )
WHERE ROWNUM=1;
person hemalp108    schedule 24.10.2016
comment
Ups maaf. Saya salah menulis contoh kedua. Seharusnya SELECT ID, MAX(SQRT(FIELD1 + FIELD2) AS CALC. Namun, tidak, jawaban Anda bukan yang saya cari. Saya ingin hasil tunggal dikembalikan, tertinggi dari tabel. GROUP BY dalam contoh Anda mencetak ratusan hasil. - person Jim Cullen; 24.10.2016
comment
@JimCullen - Perhatikan bahwa kueri ini melakukan hal yang berbeda, misalnya kueri pertama dapat mengembalikan lebih dari satu baris, baris kedua tidak dapat - person Aleksej; 24.10.2016
comment
Akankah jawaban pertama menghasilkan lebih dari satu jawaban jika ada beberapa baris yang terikat untuk nilai CALC tertinggi? - person Jim Cullen; 24.10.2016
comment
Ya, kueri pertama akan mengembalikan record dengan nilai maksimum untuk CALC, maka jika ada beberapa record untuk nilai maksimal maka semua record akan diambil. Kueri kedua hanya akan memberikan catatan meskipun ada beberapa ID untuk nilai maksimal CALC. Terserah Anda untuk memutuskan mana yang akan digunakan untuk kebutuhan Anda - person hemalp108; 24.10.2016
comment
@hemalp108 - Apakah Anda yakin memerlukan MAX dan GROUP di kueri kedua? mengingat Anda menggunakan ORDER, bukankah agregasi tidak berguna? - person Aleksej; 24.10.2016
comment
@Aleksej: Anda benar. Kueri akan berfungsi tanpa fungsi Agregat dan klausa Kelompokkan menurut juga. Memperbarui jawabannya. - person hemalp108; 24.10.2016

Jika Anda memerlukan satu nilai, dengan maksimum sqrt(field1+field2) di antara semua nilai ID, ada dua cara yang mungkin dilakukan:

select *
from (
      select *
      from yourTable
      order by sqrt(field1 + field2) desc
     )
where rownum = 1           

select id, field1, field2
from (
        select t.*,
               row_number() over ( order by sqrt(field1 + field2) desc) as rn
        from yourTable t
      )
where rn = 1  

Perhatikan bahwa jika Anda memiliki lebih dari satu ID dengan nilai maksimum yang sama, ini akan memilih salah satunya secara acak.

person Aleksej    schedule 24.10.2016