sql >> データベース >  >> RDS >> Oracle

Oracleで最も高い値を持つレコードを表示するにはどうすればよいですか?

    時々ORA-00907: missing right parenthesis つまり、右角かっこが一致しない左角かっこがあります。ただし、括弧で囲まれたステートメントの一部の構文エラーによってスローされることもあります。

    ここでの2番目の原因は次のとおりです。LIMITは、Oracleが認識しないMysqlコマンドです。ここで分析関数を使用できます:

    SELECT A1.artistid, A1.firstname, TEMP1.avgProfit
    FROM 
    (
        select  artistid
                , avgProfit
                , rank() over (order by avgProfit desc) as rnk
        from (
            SELECT 
                AVG(salesPrice - AcquisitionPrice) as avgProfit, 
                W1.artistid as artistid
            FROM dtoohey.trans T1
            INNER JOIN dtoohey.WORK W1
            ON W1.workid = T1.workid
            GROUP BY artistid
        ) 
    ) TEMP1
    INNER JOIN dtoohey.artist A1
        ON A1.artisid = TEMP1.artistid
    where TEMP1.rnk = 1
    

    これは、複数のアーティストが同じ平均利益を達成した場合に複数の行を返すRANK()関数を使用します。代わりにROW_NUMBER()を使用することをお勧めします。分析関数は非常に強力です。 詳細

    ROWN_NUMBER()、RANK()、およびDENSE_RANK()を任意のトップに適用できます- n 問題。それらの1つを使用して、最初の問題を解決することもできます。

    それはおそらくデータの問題です。 (salesPrice - AcquisitionPrice)の番号の1つである場合 nullの場合、結果はnullになり、平均には含まれません。アーティストのすべての行がnullの場合、AVG()はnullになります。

    たまたま、ソート順はNULLを最後に置きます。ただし、PARTITIONBY句はAvgProfit descで並べ替えられるため これにより、NULLの結果がランク1になります。解決策は、ウィンドウ句でNULLSLASTを使用することです。

                , rank() over (order by avgProfit desc nulls last) as rnk
    

    これにより、上部にnull以外の結果が保証されます(少なくとも1人のアーティストが両方の列に値を持っている場合)。



    1. PDOステートメントは自動的にエスケープされますか?

    2. JSONPathワイルドカードステップ(**)がMariaDBでどのように機能するか

    3. SQL Server 2005 / 2008 - 複数のファイル グループ?

    4. SQL Serverセッションで自動コミットをどのように設定しますか?