6

すべてのテーブルデータの中央値をカウントするスクリプトがあります。

SELECT avg(t1.price) as median_val FROM (
SELECT @rownum:=@rownum+1 as `row_number`, d.price
  FROM mediana d,  (SELECT @rownum:=0) r
  WHERE 1
  ORDER BY d.price
) as t1, 
(
  SELECT count(*) as total_rows
  FROM mediana d
  WHERE 1
) as t2
AND t1.row_number>=total_rows/2 and t1.row_number<=total_rows/2+1;

ここで、すべてのテーブル値ではなく、日付でグループ化された中央値を取得する必要があります。出来ますか?http://sqlfiddle.com/#!2/7cf27-その結果、2013-03-06-1.5、2013-03-05-3.5になります。

4

2 に答える 2

10

私は自分自身を失い、物事を複雑にしすぎていないことを願っていますが、ここに私が思いついたものがあります:

SELECT sq.created_at, avg(sq.price) as median_val FROM (
SELECT t1.row_number, t1.price, t1.created_at FROM(
SELECT IF(@prev!=d.created_at, @rownum:=1, @rownum:=@rownum+1) as `row_number`, d.price, @prev:=d.created_at AS created_at
FROM mediana d, (SELECT @rownum:=0, @prev:=NULL) r
ORDER BY created_at, price
) as t1 INNER JOIN  
(
  SELECT count(*) as total_rows, created_at 
  FROM mediana d
  GROUP BY created_at
) as t2
ON t1.created_at = t2.created_at
WHERE 1=1
AND t1.row_number>=t2.total_rows/2 and t1.row_number<=t2.total_rows/2+1
)sq
group by sq.created_at

ここで行ったことは、主に、日付が変更されたときに行番号を 1 にリセットし (created_at で並べ替えることが重要です)、日付を含めてグループ化できるようにすることです。行の合計を計算するクエリには、created_at も含めたので、2 つのサブクエリを結合できます。

于 2013-03-13T14:09:36.640 に答える