2017-01-17 3 views
-1

У меня есть две таблицы:SQL: GROUP BY идентификатор, имеющий макс даты

Table 1: 
worker_number, first_name , last_name , clinic , doctor_type 

1 BB BB Z2 ENT 
10 CC CC Z3 ENT 
4 DD DD Z4 Orthopedist 
5 EE EE Z5Surgeon 
8 AA AA Z1 ENT 


Table 2: 
worker_number, first_name , last_name , clinic , doctor_type, dt_date, patient_id 

'1', 'BB', 'BB', 'Z2', 'ENT', '2017-02-01 10:00:00', '1' 
'1', 'BB', 'BB', 'Z2', 'ENT', '2017-02-27 15:20:00', '1' 
'8', 'AA', 'AA', 'Z1', 'ENT', '2017-02-28 08:40:00', '1' 

В основном я хочу, чтобы получить все строки из таблицы 1 что doctor_type = "A" по заказу dt_date из таблицы 2, который имеет такой же worker_number и doctor_type

я пытался сделать Somthing как:

SELECT `table 1`.worker_number, `table 1`.first_name, `table 1`.last_name, `table 1`.clinic 
FROM `health`.`table 1` 
LEFT JOIN `health`.`table 2` 
ON `health`.`table 1`.worker_number = `health`.`table 2`.worker_number 
order by `health`.`table 2`.dt_date desc 

Но я получил следующий вывод:

8 AA AA Z1 
1 BB BB Z2 
10 CC CC Z3 
1 BB BB Z2 
3 DD DD Z4 
5 EE EE Z5 

Это работает очень хорошо для ВВ, за исключением показывает в два раза, как я могу сделать группу, для максимальной даты?

excpected результат:

8 AA AA Z1 
1 BB BB Z2 
10 CC CC Z3 
3 DD DD Z4 
5 EE EE Z5 
+0

Результирующий набор без набора данных похож на палку без леденца. См. Http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-query – Strawberry

ответ

1

Вы можете агрегировать на worker_number и сортировки на MAX (или MIN в зависимости от потребностей) в dt_date:

Попробуйте это:

SELECT 
    t1.worker_number, t1.first_name, t1.last_name, t1.clinic 
FROM 
    `health`.`table 1` t1 
     LEFT JOIN 
    `health`.`table 2` t2 ON t1.worker_number = t2.worker_number 
GROUP BY t1.worker_number 
ORDER BY MAX(t2.dt_date) DESC 
-1
Select worker_number, first_name , last_name , clinic , doctor_type 
from table1 t1 
where doctor_type = "A" 
Order By (Select dt_date from table2 
      where worker_number = t1.worker_number 
      and doctor_type = t1.doctor_type) 
1

Это добавляет дополнительный столбец в выходной. Если вы этого не хотите, вы можете обернуть этот запрос другим запросом выбора, чтобы выбрать только нужные вам поля.

SELECT `table 1`.worker_number, `table 1`.first_name, `table 1`.last_name, `table 1`.clinic, max(`table 2`.dt_date) max_dt_date 
FROM `health`.`table 1` 
LEFT JOIN `health`.`table 2` 
     ON `health`.`table 1`.worker_number = `health`.`table 2`.worker_number 
group by `table 1`.worker_number, `table 1`.first_name, `table 1`.last_name, `table 1`.clinic 
order by max_dt_date desc 
0

сделать FaTC вы не используете функция агрегации, которую вам требуется группа по статье, но вы должны использовать только DISTINCT

SELECT DISTINCT 
     `table 1`.worker_number 
    , `table 1`.first_name 
    , `table 1`.last_name 
    , `table 1`.clinic 
FROM `health`.`table 1` 
LEFT JOIN `health`.`table 2` 
ON `health`.`table 1`.worker_number = `health`.`table 2`.worker_number 
order by `health`.`table 2`.dt_date desc 
+0

Я не думаю, что это сработает, потому что предложение ORDER BY применяется только к набору результатов, а не к полным данным. Поэтому вы должны выбрать первую уникальную строку, которая может быть или не быть максимальным dt_date. –

+0

@morbidlycurious ответ для разных, но для mysql 5.6 и выше порядок не только для набора результатов .. в любом случае ... – scaisEdge