Получать первый и последний реестр нескольких дат Mysql

Я пробую создавать консультацию, которая возвращала бы мне первую и последнюю смену набора дат

Таблица: fecha_turno

fecha        turno       Cantidad 
2018-01-01     T1           100 
2018-01-01     T2           200 
2018-01-01     T3           300 
2018-01-01     T4           200 
2018-02-05     T2           200
2018-02-05     T3           300  
2018-02-06     T1           200 
2018-02-06     T2           100 
2018-02-06     T3           400 
2018-02-06     T4           500 

Здесь мы видим, что первая и последняя смена, с которой они начались, - отличная в каждой дате, из-за этого я не могу делать один:

SELECT cantidad
FROM fecha_turno
WHERE primer_turno = 'T1'

SELECT cantidad
FROM fecha_turno
WHERE ultimo_turno = 'T3'

Кто-то знал бы, как выдавать первую или последнюю смену в каждой дате?

Желанный результат - Первая смена:

fecha        turno       Cantidad 
2018-01-01     T1           100 
2018-02-05     T2           200 
2018-02-06     T1           200 

Желанный результат - Последняя смена:

fecha        turno       Cantidad 
2018-01-01     T4           200 
2018-02-05     T3           300  
2018-02-06     T4           500 
3
задан 18.03.2019, 17:42
3 ответа

Видя в детали вышедшую в свет таблицу оценивается следующее:

fecha        turno       Cantidad 
2018-01-01     T1           100  #Primer Turno de la fecha 2018-01-01
2018-01-01     T2           200 
2018-01-01     T3           300 
2018-01-01     T4           200  #Ultimo Turno de la fecha 2018-01-01

#-----------------------------------------

2018-02-05     T2           200  #Primer Turno de la fecha 2018-02-05
2018-02-05     T3           300  #Ultimo Turno de la fecha 2018-02-05

#----------------------------------------- 
2018-02-06     T1           200 #Primer Turno de la fecha 2018-02-06
2018-02-06     T2           100 
2018-02-06     T3           400 
2018-02-06     T4           500 #Ultimo Turno de la fecha 2018-02-06

#-----------------------------------------

, Если колонна turno вне типа INT serГ - в относительно простой использовать функции MAX или MIN, чтобы группировать смены в дату, но в существо типа VARCHAR (я это принимаю) require извлекать Ваши индексы, чтобы осуществлять query, потребованный.

Для этого использует ее funciГіn SUBSTRING_INDEX и цепь, которая получается начиная с нее, преобразовывается в целое число, посредством нее funciГіn CONVERT .

Для этого конкретного случая занимается со следующим:

CONVERT(SUBSTRING_INDEX(turno,'T',-1),UNSIGNED INTEGER)

Тогда уже podrГ, - чтобы осуществлять консультацию rГЎpida согласно вышедшему в свет, для despuГ©s взбираться на нее, согласно которому он требовался:

SELECT DISTINCT fecha,
       MIN(CONVERT(SUBSTRING_INDEX(turno,'T',-1),UNSIGNED INTEGER)) AS primerTurno,
       MAX(CONVERT(SUBSTRING_INDEX(turno,'T',-1),UNSIGNED INTEGER)) AS ultimoTurno
FROM fecha_turno 
GROUP BY fecha;

получается:

    fecha       primerTurno  ultimoTurno
1   2018-01-01       1            4
2   2018-02-05       2            3
3   2018-02-06       1            4

SГіlo нужен иметь в виду, что primerTurno и ultimoTurno не колонны как таковой таблицы fecha_turno, следовательно любой operaciГіn выданный, что хотелось применяться на них, нужно осуществлять посредством HAVING или одного subquery.

Например, добавляя HAVING ultimoTurno<4; предыдущие query (не забывать лишить его ; из GROUP BY fecha), имеется:

    fecha       primerTurno  ultimoTurno
1   2018-02-05       2            3
2
ответ дан 02.12.2019, 05:28
  • 1
    Спасибо! Я sirvió много твой ответ! – Eyner Cordova Plasencia 18.03.2019, 19:50

! Хорошие!

Пытается с этим:

SELECT turno, fecha FROM fecha_turno 
  where fecha = (SELECT MAX(fecha) FROM fecha_turno )
    OR fecha = (SELECT MIN(fecha) FROM fecha_turno )
  GROUP BY turno, fecha;

Ты devolverГЎ смена и дата. Где я сравниваю их для того, чтобы он был равен дате mГЎxima или дата mГ-nima.

В случае, что ты захотел изменить что-то на структуру, или предпочел получать другие данные, имей в виду MAX и MIN, так как они возвращают или mГЎximo или mГ-nimo , и ты можешь "играть" с этим.

Приветствие!

1
ответ дан 02.12.2019, 05:28
  • 1
    Привет @Youshiro, спасибо за aportació n. В общем, это уместно, что, перед тем, как отвечать, вопрос esté правильно формулируемая, чтобы предотвращать ambigü возрасты и плохие интерпретации. Мне известно, что сложно ждать, когда он оказывается таким ясным, но - способ получать проверяемые ответы и качества в сайте. Относительно твоего SQL, если ты не будешь делать полные с группами, ты не нуждаешься в том, чтобы группировать, с простым DISTINCT это достаточно и расход computacional много má s уменьшенный. Приветствие и я надеюсь, что мы продолжаем находить из-за aquí. – David JP 18.03.2019, 17:54
  • 2
    Этот ответ плохой. Если дата состоит = максимально или в минимум, смены в том, чтобы они не упали в эти случаи, не будут приняты во внимание. – gbianchi♦ 18.03.2019, 18:07

Если ты делаешь следующее

Select fecha, min(cantidad) as cantidad
from fecha_turno
group by fecha

, ты Будешь получать минимум для каждой даты.

То же самое может делаться для максимума

Select fecha, max(cantidad) as cantidad
from fecha_turno
group by fecha

Сейчас, если мы объединяем эти две консультации у нас есть для каждой даты минимум и максимум. Предполагая, что только есть смена с этим минимумом и максимумом, joineamos эта таблица с fecha_turno, и мы можем получать каждую смену

select u.fecha, f.turno, u.cantidad
from (
    Select fecha, min(cantidad) as cantidad
    from fecha_turno
    group by fecha
    union
    Select fecha, max(cantidad) as cantidad
    from fecha_turno
    group by fecha
) as u
inner join fecha_turno as f on u.fecha = f.fecha and u.cantidad = f.cantidad
order by u.fecha
0
ответ дан 02.12.2019, 05:28