2016-02-19 5 views
0

Вот мой запросполучение повторено результат MySQL запроса

SELECT DISTINCT 
    a.emp_id, 
    a.shift_id, 
    a.shift_start_date, 
    DATE((b.shift_start_date) - INTERVAL 1 DAY) AS shift_end_date 
FROM 
    temp_shift a 
     LEFT JOIN 
    temp_shift b ON a.emp_id = b.emp_id 
     AND a.shift_id != b.shift_id 
     AND a.shift_start_date < b.shift_start_date 
WHERE 
    a.active = 'Y' 
GROUP BY a.emp_id , a.shift_id , a.shift_start_date 
ORDER BY a.emp_id , a.shift_start_date 

я пытаюсь перенести дату окончания на основе следующей пересменки. Я получаю хороший результат. но моя проблема в том, что я не хочу, чтобы результаты были как 1-5,2-5,3-5,4-5,5-5,6-7 (даты), это должно быть 1-5,6-7 (даты) ,

screenshot for my query and result

+0

Этот вопрос, как представляется, по теме мне (хотя это был дан ответ раньше), так что я не могу согласиться с близким голосованием – Strawberry

+0

свяжите эту тему. что было бы полезно –

+0

Это последовательность начинается и заканчивается проблемой – Strawberry

ответ

1

"но как решить это?"

DROP TABLE IF EXISTS t; 
CREATE TABLE t(id INT); 
INSERT INTO t VALUES(1),(2),(3),(4),(6),(7),(8); 

SELECT a.id start 
    , MIN(c.id) end 
    FROM t a 
    LEFT 
    JOIN t b 
    ON b.id = a.id - 1 
    LEFT 
    JOIN t c 
    ON c.id >= a.id 
    LEFT 
    JOIN t d 
    ON d.id = c.id + 1 
WHERE b.id IS NULL 
    AND c.id IS NOT NULL 
    AND d.id IS NULL 
GROUP 
    BY a.id; 
+-------+------+ 
| start | end | 
+-------+------+ 
|  1 | 4 | 
|  6 | 8 | 
+-------+------+ 
+0

Работает хорошо. но для моей базы данных у меня есть больше, чем 6k строк, поэтому она занимает около 2 минут для выполнения всего запроса. –

+0

@KeyurShah Это решение плохо масштабируется. Однако, 6000 строк ничего. Индексируйте свою таблицу и повторите попытку. Отправьте EXPLAIN выше, если вы все еще боретесь. – Strawberry

Смежные вопросы