I had to do this just last week, and used a row_number() function ordering by LAT and LON values - however, you will have to venture into SQLite or PostGIS to accomplish it.
So here's what I did:
I needed to select the first 650 kids from North to South and allocate them to a school - this was a hypothetical scenario based on direction and capacity (650 kids fit into a school).
Using SQL Server Spatial, I determined the direction the LAT and LON values increased/decreased from 'right to left' and 'up and down', and how does that correspond to how I would use the row_number function's 'order by' parameter.
I did a little trial and error creating a spatially-enabled view in my database, and brought that into my desktop GIS (In my case ArcMap).
The view held two columns for the X and Y values, which I could use as labels to determine the right/left / up/down, and looked something like this
(SQL Server syntax)
select
table.objectid
, table.geom
, table.geom.STX as LON
, table.geom.STY as LAT
Examining the data on the map, I determined that ordering the LAT (y) values in DESC order, I could assign a row_number from North to South.
My final sql code looked something like this:
select
row_number() over (order by table.geom.STY desc) as rownum
, table.objectid
, table.geom
, table.studentnumber
from table
(I also realized that I didn't need to use the LAT/X value as I would miss kids on the 'right' side of the map - pulling from the North only (LON/Y) worked best)
Then to select the first 650 students from the North that would fit into the school, I wrapped the above into a sub-query, and took the first 650 records:
select * from (
select
row_number() over (order by table.geom.STY desc) as rownum
, table.objectid
, table.geom
, table.studentnumber
from table
) as topStudents
where topStudents.rownum <= '650'
Give or take a few tweaks of the SQL syntax, that is very doable in SQLite and/or PostGIS.