Как получить правильные минимальные и максимальные значения - PullRequest
1 голос
/ 03 апреля 2019

У меня есть следующая структура http://sqlfiddle.com/#!9/f8341c и из этих записей мой ожидаемый результат следующий

Name|MinCost |MaxCost | Open | Close | Date
ABC |13.6    | 15.3   | 14.1 | 14.2  | 2015-12-02
DEF |93.2    | 96.3   | 93.7 | 95.4  | 2015-12-02 
ABC |15.1    | 15.6   | 15.1 | 15.2  | 2015-12-03
DEF |97.2    | 97.7   | 97.7 | 97.7  | 2015-12-03

Прямо сейчас я сделал это

SELECT t1.name as 'Name',t1.min as 'MinCost',t1.max as 'MaxCost',t2.open ,t3.close,t1.times as 'Date'
  FROM(
        select name, max(cost) as 'max',min(cost) as 'min', date(time) as 'times'  
        from providers 
        group by  times,name 
        order by times
   ) AS t1
   JOIN (
     select name,cost as 'open',  time  
     from providers 
     where TIME(time) = '00:00:00'   
     group by time,name
     order by time
   ) as t2 on t1.name=t2.name
   JOIN (
       select name,cost as 'close', time  
       from providers 
       where TIME(time) = '23:59:59'   
       group by time,name
       order by time
   ) as t3 on t2.name=t3.name 
   GROUP BY t1.times,t1.name
   ORDER BY t1.times,t1.name

, который дает мне следующий вывод

| Name | MinCost | MaxCost | open | close |       Date |
|------|---------|---------|------|-------|------------|
|  ABC |    13.6 |    15.3 | 14.1 |  14.2 | 2015-12-02 |
|  DEF |    93.2 |    96.3 | 97.7 |  95.4 | 2015-12-02 |
|  ABC |    15.1 |    15.6 | 14.1 |  14.2 | 2015-12-03 |
|  DEF |    97.2 |    97.7 | 97.7 |  95.4 | 2015-12-03 |

что мне нужно для исправления запроса?

Ответы [ 2 ]

1 голос
/ 03 апреля 2019

Поскольку ваше имя не уникально, вам нужно добавить time в предложении join on, чтобы вы получили уникальное значение с name и time.

Должен работать приведенный ниже запрос Демонстрация вашей скрипки для получения ожидаемого результата

  SELECT t1.name as 'Name',t1.min as 'MinCost',t1.max as 'MaxCost',t2.open ,t3.close,t1.times as 'Date'
  FROM(
        select name, max(cost) as 'max',min(cost) as 'min', date(time) as 'times'  
        from providers 
        group by  times,name 
        order by times
   ) AS t1
   JOIN (
     select name,cost as 'open',  date(time) as 'times' 
     from providers 
     where TIME(time) = '00:00:00'   
     group by time,name
     order by time
   ) as t2 on t1.name=t2.name and t1.times = t2.times
   JOIN (
       select name,cost as 'close', date(time) as 'times' 
       from providers 
       where TIME(time) = '23:59:59'   
       group by time,name
       order by time
   ) as t3 on t2.name=t3.name  and t2.times = t3.times
   GROUP BY t1.times,t1.name
   ORDER BY t1.times,t1.name
0 голосов
/ 03 апреля 2019

Вот, пожалуйста:

select
  d.name, d.min_cost, d.max_cost,
  o.cost as open,
  c.cost as close,
  d.d as date
from (
  select
    name,
    min(cost) as min_cost,
    max(cost) as max_cost,
    min(time) as open_time,
    max(time) as close_time,
    date(time) as d
  from providers
  group by name, date(time)
) d
join providers o on o.name = d.name and o.time = d.open_time
join providers c on c.name = d.name and c.time = d.close_time
order by d.d, d.name

Результат:

name  min_cost  max_cost  open  close  date
----  --------  --------  ----  -----  ----------
ABC       13.6      15.3  14.1   14.2  2015-12-02
DEF       93.2      96.3  93.7   95.4  2015-12-02
ABC       15.1      15.6  15.1   15.2  2015-12-03
DEF       97.2      97.7  97.7   97.4  2015-12-03

Обратите внимание, что ожидаемый результат в последнем ряду несколько неверен, поскольку цена открытия составляет 97.7.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...