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

2つの連続する行の日付の違い

    PostgreSQLの場合、ラグ> ウィンドウ関数 行を比較します。自己結合してフィルターをかけるよりもはるかに効率的です。これは、MySQLではまだ標準のSQL:2003ウィンドウ関数をサポートしていないように見えるため、機能しません。以下を参照してください。

    最も低い2つだけを見つけるには、density_rankを使用できます。 ticketidのウィンドウ関数 、次に結果をフィルタリングして、density_rank()=2の行のみを返します。 、つまり、タイムスタンプが最も低いものから2番目の行。ここで lag() タイムスタンプが最も低い行が生成されます。

    このSQLFiddle を参照してください。 サンプルのDDLと出力を示しています。

    SELECT ticketid, extract(epoch from tdiff) FROM (
      SELECT
          ticketid,
          ticketdate - lag(ticketdate) OVER (PARTITION BY ticketid ORDER BY ticketdate) AS tdiff,
          dense_rank() OVER (PARTITION BY ticketid ORDER BY ticketdate) AS rank
      FROM Table1
      ORDER BY ticketid) x
    WHERE rank = 2;
    

    ticketdateを使用しました date であるため、日付列の名前として 列のひどい名前(データ型名)であり、決して使用しないでください。多くの状況で機能するには、二重引用符で囲む必要があります。

    ポータブルなアプローチは、おそらく他の人が投稿した自己参加です。上記のウィンドウ関数のアプローチは、おそらくOracleでも機能しますが、MySQLでは機能しないようです。私が知る限り、SQL:2003ウィンドウ関数をサポートしていません。

    SET sql_mode ='ANSI' を使用すると、スキーマ定義はMySQLで機能します。 timestampを使用します タイムスタンプ付きタイムスタンプの代わりに 。ウィンドウ関数は機能しないようです。 MySQLがOVERを窒息させる 句。 このSQLFiddle を参照してください。 。



    1. SQL Serverで(decimal、float、int)に変換できないフィールド値を判別する方法

    2. Python、SQLite、SQLAlchemyによるデータ管理

    3. PDO:mysql INSERT ON DUPLICATEKEYUPDATEを使用して更新または挿入されたレコードを確認します

    4. Oracle:複数のテーブルの更新=> ORA-01779:キーが保持されていないテーブルにマップする列を変更できません