База данных H2 - альтернатива Rank () и Row_Num () - PullRequest
4 голосов
/ 16 января 2012

Я использую базу данных H2 в моем Java-приложении. Похоже, что он не поддерживает функции rank() и row_num(), поскольку они все еще находятся в их списке дорожной карты

Вот запрос, который я пытаюсь выполнить

select * from (
   select *,
          rank() over(partition by MSISDN order by PORT_IN_DATE desc) rank 
   from TEST_PORTIN
) s 
where rank = 1 
  AND PORT_IN_DATE > '2012-01-16 23:20:27' 
ORDER BY PORT_IN_DATE

1 Ответ

1 голос
/ 12 ноября 2015

Вам не нужно RANK() для вашего конкретного запроса. Вы можете переписать его следующим образом:

SELECT *
FROM TEST_PORTIN t1
WHERE PORT_IN_DATE > '2012-01-16 23:20:27'
AND NOT EXISTS (
    SELECT *
    FROM TEST_PORTIN t2
    WHERE t1.MSISDN = t2.MSISDN -- PARTITION BY clause translation
    AND t1.PORT_IN_DATE > t2.PORT_IN_DATE -- ORDER BY clause translation
)
ORDER BY PORT_IN_DATE

Или, немного более изящно (но не обязательно быстрее), используя количественный предикат сравнения

SELECT *
FROM TEST_PORTIN t1
WHERE PORT_IN_DATE > '2012-01-16 23:20:27'
AND PORT_IN_DATE >= ALL (
    SELECT PORT_IN_DATE
    FROM TEST_PORTIN t2
    WHERE t1.MSISDN = t2.MSISDN
)
ORDER BY PORT_IN_DATE
...