Mysql
 sql >> база данни >  >> RDS >> Mysql

Бройте медианата, групирана по ден

Надявам се да не съм се изгубил и да не съм усложнил нещата, но ето какво измислих:

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:[email protected]+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, за да можем да обединим двете подзаявки.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:Как да групирате SELECT редове с множество двойки в клауза WHERE

  2. Кога да използвате ляво външно съединение?

  3. Попълване на календар с PHP foreach код

  4. Как да намерите втората най-висока заплата в mysql

  5. Правилно управление на ресурсите на базата данни:курсор и връзка