Get next row based on current row and conditional ordering I have this table:
Id   Name
1    M
2    P
3    A1
4    C
5    A2
6    T
1009 A2
1011 A1
1010 A3

I can get it sorted by Id if Id &lt; 1000 and by Name if Id &gt; 1000 (thanks to the help of people here) with this query:
SELECT *
FROM table1
ORDER BY
  CASE WHEN Id &lt; 1000 THEN Id ELSE 1000 END,
  Name;

Which gives
Id   Name
1    M
2    P
3    A1
4    C
5    A2
6    T
1009 A2
1010 A3
1011 A1

Now, given an Id, I want the next row in the order I just ordered by. So far, I've managed to get the result with two SQL queries, based on the givenId. If givenId &lt; 1000 I do:
SELECT *
FROM table1
WHERE
  Id &gt; @givenId
ORDER BY
    CASE WHEN Id &lt; 1000 THEN Id ELSE 1000 END,
    Name
LIMIT 1

If givenId &gt; 1000 I do:
SELECT *
FROM table1
WHERE
  Id &gt; 1000 AND Name &gt; (SELECT Name FROM table1 WHERE Id = @givenId)
ORDER BY
    CASE WHEN Id &lt; 1000 THEN Id ELSE 1000 END,
    Name
LIMIT 1

The Id with value 1000 will never exist so I don't have to worry about that case. This works, but I'm wondering if there's a better way to do this? Perhaps with one query instead of two? I've tried to come up with something better but can't seem to.
This should get you started:
SELECT *
FROM (
  SELECT Id, Name, LEAD(Id) OVER w AS Next_Id, LEAD(Name) OVER w AS Next_Name
  FROM table1
  WINDOW w AS (ORDER BY CASE WHEN Id &lt; 1000 THEN Id ELSE 1000 END, Name)
) WHERE Id = 6;

Note that the order by is working correctly as it returns Id = 1011 as the next Id.
https://dbfiddle.uk/?rdbms=sqlite_3.27&amp;fiddle=ce891ef6631a142500b59ff2c686e108