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
を参照してください。 。