2012-01-16 2 views
4

Я использую базу данных H2 в своем приложении java. Кажется, что он не поддерживает rank() и row_num() функции, поскольку они все еще находятся на их roadmap listБаза данных H2 - Альтернатива 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 
+0

возможно дубликат [SQL с рангом и раздел] (HTTP: //stackoverflow.com/questions/8861457/sql-with-rank-and-partition) –

+1

См. также форум H2: http://groups.google.com/group/h2-database/browse_thread/thread/f063de014c88bda7 –

ответ

1

Вам не нужно 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 
Смежные вопросы