Как объединить столбец с датой макс / мин при выборе с последней датой, в которой имеются данные - PullRequest
0 голосов
/ 12 июля 2019

Мне нужно объединить одну таблицу с 2 параметрами, чтобы показать состояние последнего обновления сведений, чтобы проверить окончание / текущий с MAX (...) / MIN (...). Что я могу сделать для этого?

Я попытался LEFT JOIN, но он возвращается к нулю

SELECT a.showonly 
     , a.want_this_parameter_lastdate
     , min(a.xdate) start
     , max(a.xdate) stop
     , b.lastdate
  FROM samedatabase a
       LEFT JOIN (SELECT xdate lastdate
                       , want_this_parameter_lastdate 
                    FROM samedatabase 
                   WHERE ROWNUM = 1 
                  ORDER BY xdate DESC) b
              ON a.want_this_parameter_lastdate = b.want_this_parameter_lastdate
 WHERE something IN (SELECT DISTINCT equalsomething 
                       FROM another WHERE input like '...') 
   AND xdate> sysdate - 7
GROUP BY a.showonly, a.want_this_parameter_lastdate, b.lastdate
ORDER BY start ASC;

после запроса я получаю это

showonly|want_this_parameter|start  |stop   |lastdate
a1      |b1*                |5/7/19 |6/7/19 |(null)
a2      |b2**               |6/7/19 |7/7/19 |(null)
a3      |b1*                |7/7/19 |8/7/19 |(null)
a4      |b2**               |9/7/19 |10/7/19|(null)
a5      |b4                 |10/7/19|11/7/19|(null)

Я ожидал, что ( стоп - это последний b1, использованный в a1, lastdate - последний b1, использованный во всей таблице)

showonly|want_this_parameter|start  |stop   |lastdate
a1      |b1*                |5/7/19 |6/7/19 |12/17/19--Last B1 used
a2      |b2**               |6/7/19 |7/7/19 |11/17/19--Last B2 used
a3      |b1*                |7/7/19 |8/7/19 |12/17/19--Last B1 used
a4      |b2**               |9/7/19 |10/7/19|12/17/19--Last B2 used
a5      |b4                 |10/7/19|11/7/19|12/17/19--Last B4 used

*Same b1
**Same b2

UPDATE Я, наконец, получил это, но все еще беспокоюсь о времени, чтобы запросить производительность потому что MAX (...) получит всю таблицу правильно? Как я могу улучшить эту производительность.

SELECT a.showonly
     , a.want_this_parameter_lastdate
     , min(a.xdate) start
     , max(a.xdate) stop
     , b.lastdate
  FROM samedatabase a 
       LEFT JOIN (SELECT MAX(xdate) lastdate, want_this_parameter_lastdate 
                    FROM samedatabase 
                  GROUP BY want_this_parameter_lastdate) b
              ON a.want_this_parameter_lastdate = b.want_this_parameter_lastdate
 WHERE something IN (SELECT DISTINCT equalsomething 
                       FROM another 
                      WHERE input like '...') 
   AND xdate> sysdate - 7
GROUP BY a.showonly, a.want_this_parameter_lastdate, b.lastdate
ORDER BY start ASC;

1 Ответ

2 голосов
/ 12 июля 2019

Я думаю, что простой подзапрос сделает работу быстрее, таким образом вы устраните двойную группировку, которая не является необходимой:

select showonly, parameter, min(xdate) min_dt, max(xdate) max_dt,
       (select max(xdate) from samedatabase where parameter = s1.parameter) lst_dt
  from samedatabase s1
  where xdate > sysdate - 7
    and something in (select equalsomething from another where input like 'i%')
  group by showonly, parameter

Демоверсия dbfiddle

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