Нужна помощь в получении высоких и низких значений и соответствующих им дат из базы данных SQL - PullRequest
0 голосов
/ 25 августа 2018

Я пытаюсь использовать это, но это просто время ожидания и продолжает загружаться вечно.Я пытаюсь получить максимальную, минимальную и минимальную дату пули для максимума и минимума

SELECT usd,date,slug,datediff(CURDATE(), date) as datediff FROM historical h 
inner join(
SELECT MIN(usd + 0) as low FROM historical GROUP BY slug
)i 
inner join(
SELECT MAX(usd + 0) as high FROM historical GROUP BY slug
)j 
WHERE h.usd = i.low OR h.usd = j.high 

Пример данных:

slug    |   usd     |    date .     
------------------------------------        
gold    |   435    |  01-05-2015 . 
gold    |   5      |  01-12-2015 . 
gold    |   251    |  01-06-2015 . 
gold    |   353    |  01-07-2015 . 
silver  |   5      |  01-08-2015 . 
silver  |   4      |  01-09-2015 . 
silver  |   78     |  01-15-2015 . 
silver  |   100    |  01-25-2015 . 

что я хочу вернуть:

slug     |  high   |    highdate   |   low    |  lowdate 
------------------------------------------------------------
gold     |  435   |   01-05-2015  |   5     |  01-12-2015
silver   |  100   |   01-25-2015  |   4     |  01-09-2015

Когда я пытаюсь использовать это только для низких значений, оно прекрасно работает на 100%

SELECT usd,btc,date,slug,datediff(CURDATE(), date) as datediff FROM historical h 
inner join(
    SELECT MIN(usd + 0) as low FROM historical GROUP BY slug
)i 
WHERE h.usd = i.low

1 Ответ

0 голосов
/ 25 августа 2018

Я думаю, вы хотите:

select h.slug,
       min(case when replace(usd, '$', '') + 0 = min_usd then usd end) as min_usd,
       min(case when replace(usd, '$', '') + 0 = min_usd then usd end) as min_date,
       max(case when replace(usd, '$', '') + 0 = max_usd then usd end) as max_usd,
       min(case when replace(usd, '$', '') + 0 = max_usd then usd end) as max_date
from historical h join
     (select slug, min(replace(usd, '$', '') + 0) as min_usd,
             max(replace(usd, '$', '') + 0) as max_usd
      from historical 
      group by slug
     ) s
     on h.slug = s.slug
group by h.slug;

Вычисление для min() и max() довольно сложно, потому что вы сохраняете значение в виде строки.Я настоятельно рекомендую хранить значение в виде десятичного / числового типа.Это подходит для валют.

РЕДАКТИРОВАТЬ:

Вопрос немного изменился.Соответствующий запрос выглядит так:

select h.slug,
       min(case when usd + 0 = min_usd then usd end) as min_usd,
       min(case when usd + 0 = min_usd then usd end) as min_date,
       max(case when usd + 0 = max_usd then usd end) as max_usd,
       min(case when usd + 0 = max_usd then usd end) as max_date
from historical h join
     (select slug, min(usd + 0) as min_usd,
             max(usd + 0) as max_usd
      from historical 
      group by slug
     ) s
     on h.slug = s.slug
group by h.slug;

Все + 0 нужны только в том случае, если usd хранится в виде строки.В остальном числовые сравнения в порядке.

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