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

隣接するレコード間の差異を取得するSQLクエリ

    データの再フォーマットを少し逃れることはないと思います。そのために、一時テーブルを使用できます。

    :すべての時間形式の計算を回避するために、ソースデータとして時間ではなく整数を使用してテーブルを作成しましたが、実際には同じです。

    私が作成したソースデータは次のとおりです。

    CREATE TABLE `table` (
    `start` INT(11) NOT NULL,
    `end` INT(11) NOT NULL,
    `type` VARCHAR(6));
    
    INSERT INTO `table` VALUES
    (1,3,'A'),
    (5,7,'A'),
    (6,10,'A'),
    (2,6,'B'),
    (3,4,'B'),
    (5,11,'B'),
    (12,13,'B');
    

    次に、答えを得るために使用する必要のあるスクリプトは次のとおりです。

    DROP TABLE IF EXISTS temp;
    CREATE TABLE temp (
    id int(100) AUTO_INCREMENT,
    start int(11) NOT NULL,
    type VARCHAR(6),
    PRIMARY KEY id (id));
    
    INSERT INTO temp(start, type) 
    SELECT start, type FROM table
    ORDER BY type, start;
    
    SELECT t1.type, AVG(t1.start - t2.start) AS avg_gap 
    FROM temp t1
    JOIN temp t2 ON t1.type = t2.type AND t1.id = (t2.id + 1)
    WHERE t1.start - t2.start < 5
    GROUP BY t1.type;
    

    結果は次のとおりです。

    type   avg_gap
     A     2.5
     B     1.5
    

    編集: 編集の新しいルールによると:私のルールは、5より大きいギャップを計算しないことです(WHEREでわかるように) 最終クエリの句)。したがって、タイプBの最後のギャップは無視されました。



    1. SQL Server 2008 の .mdf および .ldf ファイルからデータベースを復元する

    2. GROUPBY式のヘルプではないOracleSQLGROUP BY

    3. JSONをMySQLテーブルに挿入するか、存在する場合は更新します

    4. エラー:互換性のない文字エンコード:UTF-8およびASCII-8BIT