MySQL - подзапрос / JOIN той же таблицы различных элементов ревизии

0

У меня такая таблица mysql:

data_store_id   data_field_id   data_record_id  data_record_revision_id value
13992   70  705 2332    fraus
13993   71  705 2332    john
13994   86  705 2332    
13995   87  705 2332    01/01/2020
13996   88  705 2332    1
13997   84  705 2332    10/10/2020
13998   85  705 2332    
13999   81  705 2332    1
14000   82  705 2332    
14001   83  705 2332    
14002   71  705 2333    nick
14003   87  705 2333    10/10/2015
14004   84  705 2333    
14005   71  705 2334    
14006   71  705 2335    peter
14007   86  705 2336    01/01/2012
14008   70  706 2337    liquorice
14009   71  706 2337    antony
14010   86  706 2337    
14011   87  706 2337    02/02/2150
14012   88  706 2337    1
14013   84  706 2337    01/01/1987
14014   85  706 2337    
14015   81  706 2337    1
14016   82  706 2337    
14017   83  706 2337    
14018   71  706 2338    dave
14019   87  706 2338    20/01/2011
14020   84  706 2338    
14021   71  706 2339    
14022   71  706 2340    winter
14023   86  706 2341    01/01/2012

Я пытаюсь написать запрос, чтобы выйти: для каждого "data_record_id" для каждого "data_field_id", последнего "data_record_revision_id" "значение" s. Например, мне нужно получить что-то вроде:

data_record_id  data_field_id_70    data_field_id_71    data_field_id_87
705 fraus   peter   10/10/2015
706 liquorice   winter  20/01/2011

есть идеи? большое спасибо

  • 0
    все возможные значения data_field_id известны?
  • 0
    @guigoz да, они известны. 70, 71, 81, 83, 84, 85, 87, 88
Показать ещё 2 комментария
Теги:
join
subquery

1 ответ

1
Лучший ответ
select
  data_record_id,
  max(case when data_field_id=70 then value end) data_record_id_70,
  max(case when data_field_id=71 then value end) data_record_id_71,
  max(case when data_field_id=87 then value end) data_record_id_87
from
 (select data_field_id,data_record_id,substring_index(group_concat(value order by data_record_revision_id desc separator '|'),'|',1) value
  from your_table
  group by data_record_id,data_field_id
 ) s
group by data_record_id

вам придется повторить max(case when data_field_id=X then value end) data_record_id_X для каждого значения data_field_id

Шаг 1: выберите только одну строку для каждой группы
получить последнее значение data_record_revision_id с помощью group_concat и substring_index

setp 2: транспонирование строк по столбцам
переместить data_field_id в столбцы

Ещё вопросы

Сообщество Overcoder
Наверх
Меню