Get next row based on current row and conditional ordering
-
08-03-2021 - |
문제
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 < 1000
and by Name
if Id > 1000
(thanks to the help of people here) with this query:
SELECT *
FROM table1
ORDER BY
CASE WHEN Id < 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 < 1000
I do:
SELECT *
FROM table1
WHERE
Id > @givenId
ORDER BY
CASE WHEN Id < 1000 THEN Id ELSE 1000 END,
Name
LIMIT 1
If givenId > 1000
I do:
SELECT *
FROM table1
WHERE
Id > 1000 AND Name > (SELECT Name FROM table1 WHERE Id = @givenId)
ORDER BY
CASE WHEN Id < 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 < 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&fiddle=ce891ef6631a142500b59ff2c686e108