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

自己結合とランキングを必要とするSQL

    必要なものがわかった場合は、分析関数 およびウィンドウ句 。

    select season, matchdate, hometeam, awayteam, homegoals, awaygoals,
        case when home_cnt >= 5 and away_cnt >= 5 then
            home_tot + away_tot
        else null end as totalgoals
    from (
        select season, matchdate, hometeam, awayteam, homegoals, awaygoals,
            count(*) over (partition by season, hometeam
                order by matchdate
                rows between 5 preceding and 1 preceding) as home_cnt,
            sum(homegoals + awaygoals) over (partition by season, hometeam
                order by matchdate
                rows between 5 preceding and 1 preceding) as home_tot,
            count(*) over (partition by season, awayteam
                order by matchdate
                rows between 5 preceding and 1 preceding) as away_cnt,
            sum(homegoals + awaygoals) over (partition by season, awayteam
                order by matchdate
                rows between 5 preceding and 1 preceding) as away_tot
        from matches
    )
    order by season, matchdate, hometeam, awayteam;
    

    内側の選択では、分析バージョンのcountを使用して、各シーズンのホーム/アウェイチームごとに、試合数と試合全体のゴールの総数を計算します。 およびsum 、およびウィンドウ句rows between ...の間にあります 現在の行を除いて、両方を前の5つに制限します。これは、あなたが望むものだと思います。次に、外側の選択により、現在の行の2つのチームに関連する合計が加算されますが、両方のカウントがチェックされ、どちらかが5未満の場合は合計がnullのままになります。matchesにのみヒットすることに注意してください。 テーブル1回。

    注文の直前に追加のフィルターを使用:

    where season = 2012 and homeTeam = 'Norwich' and awayteam = 'Aston Villa'
    

    ...取得:

        SEASON MATCHDATE HOMETEAM                  AWAYTEAM                   HOMEGOALS  AWAYGOALS TOTALGOALS
    ---------- --------- ------------------------- ------------------------- ---------- ---------- ----------
          2012 13-MAY-12 Norwich                   Aston Villa                        2          0         30
    

    これを使用して、一致する行のテーブルを更新できますが、通常は、ビュー内で発生する可能性のあるデータ整合性エラーを回避するために、必要に応じて計算します。



    1. OracleデータベースをSQLファイルにエクスポートしますか?

    2. JPAHibernateがストアドプロシージャを呼び出す

    3. データベースプロシージャがアプリケーションから何度も呼び出されたときにパフォーマンスが影響するかどうか。

    4. MariaDBでのREPEAT()のしくみ