Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server Sql server-基于另一列查找列的范围_Sql Server - Fatal编程技术网

Sql server Sql server-基于另一列查找列的范围

Sql server Sql server-基于另一列查找列的范围,sql-server,Sql Server,我正在尝试验证一些数据,我想为A列的选择值找到B列的最小值和最大值。它如下所示: Select min(colB), max(colB) From table where colA = SomeValue 我想知道的是,我如何指定一个特定的间隔,比如说10,它将给我每10 a列b的最小值和最大值。它的功能如下: for(int i = minValueOfColA; 1<maxValueOfColA;i+=10){ Select min(colB), max(colB)

我正在尝试验证一些数据,我想为A列的选择值找到B列的最小值和最大值。它如下所示:

Select min(colB), max(colB)
From table 
where colA = SomeValue
我想知道的是,我如何指定一个特定的间隔,比如说10,它将给我每10 a列b的最小值和最大值。它的功能如下:

 for(int i = minValueOfColA; 1<maxValueOfColA;i+=10){   
    Select min(colB), max(colB)
    From table 
    where colA = i
}
select a/10, min(b), max(b)
from Table
group by (a / 10)
declare @interval int;

set @interval = 10;

select cast(a/@interval * @interval as varchar) + '-' + cast((a/@interval * @interval) + (@interval - 1) as varchar), min(b), max(b)
from Table
group by (a / @interval)
insert into Table values (1, 1), (1, 15), (11, 3), (12, 4), (17, 8), (20, 5)

不过我想用sql来做

对我来说似乎是一个简单的分组查询:

SELECT MIN(ColB), MAX(ColB), ColA
FROM Table
WHERE ColA IN(<Values list>)
GROUP BY ColA

现在,您所要做的就是将值列表设置为基于间隔的值

我不是100%确定我完全理解你,但是像这样的事情怎么样:

 for(int i = minValueOfColA; 1<maxValueOfColA;i+=10){   
    Select min(colB), max(colB)
    From table 
    where colA = i
}
select a/10, min(b), max(b)
from Table
group by (a / 10)
declare @interval int;

set @interval = 10;

select cast(a/@interval * @interval as varchar) + '-' + cast((a/@interval * @interval) + (@interval - 1) as varchar), min(b), max(b)
from Table
group by (a / @interval)
insert into Table values (1, 1), (1, 15), (11, 3), (12, 4), (17, 8), (20, 5)
然后,您可以更改10的出现次数以适应您选择的间隔

对于更漂亮的范围输出和间隔输入,如下所示:

 for(int i = minValueOfColA; 1<maxValueOfColA;i+=10){   
    Select min(colB), max(colB)
    From table 
    where colA = i
}
select a/10, min(b), max(b)
from Table
group by (a / 10)
declare @interval int;

set @interval = 10;

select cast(a/@interval * @interval as varchar) + '-' + cast((a/@interval * @interval) + (@interval - 1) as varchar), min(b), max(b)
from Table
group by (a / @interval)
insert into Table values (1, 1), (1, 15), (11, 3), (12, 4), (17, 8), (20, 5)
对于这样填充的表:

 for(int i = minValueOfColA; 1<maxValueOfColA;i+=10){   
    Select min(colB), max(colB)
    From table 
    where colA = i
}
select a/10, min(b), max(b)
from Table
group by (a / 10)
declare @interval int;

set @interval = 10;

select cast(a/@interval * @interval as varchar) + '-' + cast((a/@interval * @interval) + (@interval - 1) as varchar), min(b), max(b)
from Table
group by (a / @interval)
insert into Table values (1, 1), (1, 15), (11, 3), (12, 4), (17, 8), (20, 5)
对于间隔=10,给出以下结果:

0-9     1   15
10-19   3   8
20-29   5   5
对于间隔=15,这是:

0-14    1   15
15-29   5   8

我希望这就是你要找的。由于增量为+10,值为2的ColA将被忽略

查询:

DECLARE @Table TABLE
(
colA INT,
colB INT
)

INSERT @Table VALUES(1, 2), (1, 39), (2, 2), (11, 21), (11, 42)

;WITH cteIncrement
AS
(
    SELECT MIN(colA) minColA, MAX(colA) maxColA
    FROM @Table
    UNION ALL
    SELECT minColA + 10, maxColA
    FROM cteIncrement
    WHERE minColA + 10 <= maxColA
)
SELECT MIN(t.colB) minColB, MAX(t.colB) maxColB
FROM cteIncrement cte
JOIN @Table t
ON t.colA = cte.minColA
GROUP by t.colA

你认为没有CTE,这能解决你的问题吗

CREATE TABLE T2 (COLA INT, COLB INT)
INSERT INTO T2 VALUES (2,3)
INSERT INTO T2 VALUES (2,5)
INSERT INTO T2 VALUES (3,10)
INSERT INTO T2 VALUES (4,20)
INSERT INTO T2 VALUES (5,30)
INSERT INTO T2 VALUES (12,35)
INSERT INTO T2 VALUES (12,52)
INSERT INTO T2 VALUES (13,40)


SELECT COLA, MIN(T2.COLB) AS MIN_COLB, MAX(T2.COLB) AS MAX_COLB, 
FROM T2
CROSS JOIN (SELECT MIN(COLA) AS MIN_COLA FROM t2) B
GROUP BY COLA 
HAVING (COLA-MIN(B.MIN_COLA))%10=0
输出:

COLA        MIN_COLB    MAX_COLB
----------- ----------- -----------
2           3           5
12          35          52

您可以添加一些测试数据和您希望从这些数据中输出的数据吗?Sql server不支持for循环。使用while循环来模拟for循环,所有内容都应该是fineDeclare counter SET counter=minValueOfColA whilecounter@RamGrandhi-我认为重点是显示一个伪代码,除了OP希望在中实现相同的逻辑SQL@GurV是的,我给出的只是一个伪代码。这就是为什么不将其作为答案发布。我认为值范围应从1开始。从我的观点来看,应该是1-10,11-20等等。我认为这取决于0是否是一个可能的值。如果范围从1开始,那么0值将被忽略。这个答案比我想做的要简单得多。