从 table 中选择一个范围的 USQL 查询

USQL query for SELECTING a range from a table

数据为

    index id
        1 112
        1 112
        2 109
        2 109
        3 125
        3 125
        4 199
        4 199
        5 100
        5 100

id 不是递增的,但本质上是顺序的,将其作为 GUID,这就是为什么我为范围查询分配索引

用户将给出@startid @endid,我将得到这个范围的行

现在首先我得到对应这些id的索引,比如

@indexes = SELECT DISTINCT index 
 FROM @table 
WHERE id IN (@startid, endid);

结果我得到(假设@startid = 2 和@endid = 4)

2
4

现在我知道范围将在 2 和 4 之间,即我想要对应于 2,3 和 4 的行

@result= SELECT index AS index,
         id AS id 
         FROM @data
         WHERE 
         index BETWEEN (THE TWO ENTRIES FROM @indexes)

本可以使用嵌套 SELECT 完成此操作,但 USQL 不支持它。

现在有没有办法将@indexes 视为列表并指定范围之类的???

BETWEEN在U-SQL中是支持的,只是区分大小写,eg

DECLARE CONST @startId int = 2;
DECLARE CONST @endId int = 4;


@input = SELECT *
     FROM (
        VALUES
        ( 1, 112 ),
        ( 1, 112 ),
        ( 2, 109 ),
        ( 2, 109 ),
        ( 3, 125 ),
        ( 3, 125 ),
        ( 4, 199 ),
        ( 4, 199 ),
        ( 5, 100 ),
        ( 5, 100 )
    ) AS x ( index, id );


@output =
    SELECT *
    FROM @input
    WHERE index BETWEEN @startId AND @endId;


OUTPUT @output TO "/output/output.csv"
USING Outputters.Csv(quoting:false);

我的结果:

替代方法:

    DECLARE CONST @startId int = 109;
    DECLARE CONST @endId int = 199;


    @input = SELECT *
         FROM (
            VALUES
            ( 1, 112 ),
            ( 1, 112 ),
            ( 2, 109 ),
            ( 2, 109 ),
            ( 3, 125 ),
            ( 3, 125 ),
            ( 4, 199 ),
            ( 4, 199 ),
            ( 5, 100 ),
            ( 5, 100 )
        ) AS x ( index, id );


@output =
    SELECT i. *
    FROM @input AS i
         CROSS JOIN
         (
         SELECT MIN(index) AS minIndex,
                MAX(index) AS maxIndex
         FROM @input AS i
         WHERE id IN ( @startId, @endId )
               ) AS x
    WHERE i.index BETWEEN x.minIndex AND x.maxIndex;    

    OUTPUT @output TO "/output/output.csv"
    USING Outputters.Csv(quoting:false);