从 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);
数据为
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);