Я не уверен, как это вплетено в остальную часть вашего запроса, поэтому я использовал CTE
WITH max_next AS (
SELECT r.id as max_id
,r.next_id
FROM (
SELECT m.id
,m.next_id
,ROW_NUMBER() OVER (ORDER BY m.id DESC) AS rn
FROM (
SELECT n.* -- to provide data to satisfy CONDITIONS
,LEAD(n.id) OVER(ORDER BY n.id) as next_id
FROM my_table AS n
) AS m
WHERE CONDITIONS
) AS r
WHERE r.rn = 1
)
Я бы также сократил n. * До столбцов, необходимых для УСЛОВИЙ, до a, не быть неявным, поскольку * замедляет время компиляции (или имеет историческое значение), поскольку все метаданные должны быть прочитаны, чтобы понять, какие столбцы находятся в ЛЮБОМ, и хотя компиляция также может обрезать неиспользуемые столбцы, это быстрее, если вы просто попросите то, что вы хотите (в лучшем случае просто экономия времени на компиляцию, в худшем случае он прочитает все данные, когда вам нужно только x количество прочитанных столбцов)
И заимствуя решение Гордона, ROW_NUMBER
часть могла бы быть проще.
WITH max_next AS (
SELECT m.id
,m.next_id
--, plus what ever other things you want from m
FROM (
SELECT n.* -- to satisfy CONDITIONS needs
,LEAD(n.id) OVER(ORDER BY n.id) as next_id
FROM my_table AS n
) AS m
WHERE CONDITIONS
ORDER BY m.id DESC LIMIT 1
)
Итак, например, для @PIG,
WITH my_table AS (
SELECT column1 AS id
,column2 AS con1
,column3 AS other
FROM VALUES (1,'a',123),(2,'b',234),(3,'a',345),(5,'b',456),(7,'a',567),(10,'c',678)
)
SELECT m.id
,m.next_id
,m.other
FROM (
SELECT n.* -- to satisfy CONDITIONS needs
,LEAD(n.id) OVER(ORDER BY n.id) as next_id
FROM my_table AS n
) AS m
WHERE m.con1 = 'b'
ORDER BY m.id DESC LIMIT 1;
дает 5, 7, 456
, который является последним 'b'
и новой строкой, и дополнительное значение в my_table для развлекательных целей (и запускается в Snowflake to, что означает, что я также исправил предыдущий SQL).
person
Simeon Pilgrim
schedule
22.12.2019