1

次のような新しいデータで定期的に更新されるかなり大きなテーブルがあります。

id  |  name  |  c1  |  c2  |  c3  |  c4  |  time
-------------------------------------------------
 1  |  miley |  23  |  11  |  21  |  18  |  2013-01-13 20:26:25
 2  |  john  |  31  |  29  |  23  |  27  |  2013-01-13 20:26:25
 3  |  steve |  44  |  31  |  33  |  35  |  2013-01-13 20:26:25
 4  |  miley |  34  |  44  |  47  |  48  |  2013-01-14 08:26:25
 5  |  john  |  27  |  53  |  49  |  52  |  2013-01-14 08:26:25
 6  |  steve |  27  |  62  |  50  |  64  |  2013-01-14 08:26:25
 7  |  miley |  44  |  54  |  57  |  87  |  2013-01-14 20:26:25
 8  |  john  |  37  |  93  |  59  |  62  |  2013-01-14 20:26:25
 9  |  steve |  85  |  71  |  87  |  74  |  2013-01-14 20:26:25
...etc

毎日、各列の差が最も大きかったのは誰かを見つけるためのクエリが必要です。(たとえば 14 日 - スティーブは c1 と c3 で最大の増加、ジョンは c2、マイリーは c4)。各人の数は常に増加しているため、どの日の最初のエントリも、その日の最後のエントリより常に少なくなると想定できます。

誰かが少なくとも私を正しい方向に向けることができれば、ほとんど成功せず、あまり進んでいないいくつかのクエリを実行しようとしましたか?

望ましい出力は、最大の増加を示した名前と差異を含む各行の配列であることが理想的です。これらすべてを 1 つのクエリで実行できるかどうかはわかりませんが、実際に必要なのは、各列で最大の増加を示した人物の名前と、その差が何であったかだけです。

.

壊す

14 日にすべての人の最初と最後のエントリを取得する必要があります (id: 4 から 9)。c1 値の差を比較し、差が最も大きい人の名前を返します。c2、c3、および c4 について繰り返します。


これまでのところ、1列のみを取得しようとしているorangecrushのおかげです:(エラー:グループ関数の無効な使用)

        "SELECT nm, diff_c1 FROM (
         SELECT NAME nm, MAX(c1) - MIN(c1) DIFF_C1 FROM TABLE AS a
             WHERE `time` > DATE_SUB(now(), INTERVAL 1 DAY)
             GROUP BY NAME) AS c 
         WHERE diff_c1 = (
         (SELECT max(MAX(c1) - MIN(c1)) FROM TABLE AS b 
         WHERE `time` > DATE_SUB(now(), INTERVAL 1 DAY) GROUP BY NAME)
         )"
4

1 に答える 1

1

これを試すことができます:

SELECT nm, 'c1', diff_c1
  FROM (SELECT NAME nm, MAX(C1) - MIN(C1) DIFF_C1
          FROM TEST
         WHERE trunc(TIME) = '14-JAN-2013'
         GROUP BY NAME)
 WHERE diff_c1 = ((SELECT max(MAX(C1) - MIN(C1))
                     FROM TEST
                    WHERE trunc(TIME) = '14-JaN-2013'
                    GROUP BY NAME))
union
SELECT nm, 'c2', diff_c2
  FROM (SELECT NAME nm, MAX(C2) - MIN(C2) DIFF_C2
          FROM TEST
         WHERE trunc(TIME) = '14-JaN-2013'
         GROUP BY NAME)
 WHERE diff_c2 = ((SELECT max(MAX(C2) - MIN(C2))
                     FROM TEST
                    WHERE trunc(TIME) = '14-JaN-2013'
                    GROUP BY NAME))
union
SELECT nm, 'c3', diff_c3
  FROM (SELECT NAME nm, MAX(C3) - MIN(C3) DIFF_C3
          FROM TEST
         WHERE trunc(TIME) = '14-JaN-2013'
         GROUP BY NAME)
 WHERE diff_c3 = ((SELECT max(MAX(C3) - MIN(C3))
                     FROM TEST
                    WHERE trunc(TIME) = '14-JaN-2013'
                    GROUP BY NAME))
union
SELECT nm, 'c4', diff_c4
  FROM (SELECT NAME nm, MAX(C4) - MIN(C4) DIFF_C4
          FROM TEST
         WHERE trunc(TIME) = '14-JaN-2013'
         GROUP BY NAME)
 WHERE diff_c4 = ((SELECT max(MAX(C4) - MIN(C4))
                     FROM TEST
                    WHERE trunc(TIME) = '14-JaN-2013'
                    GROUP BY NAME))

日付をハードコーディングしました。このクエリが機能していることが判明した場合は、後で動的に呼び出すことができます。テストに使用したテーブル名: TEST.

于 2013-01-15T05:56:34.107 に答える