Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.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查询_Sql_Sql Server - Fatal编程技术网

最小值和最大值的SQL查询

最小值和最大值的SQL查询,sql,sql-server,Sql,Sql Server,我在表格中有以下数据。每行中的值的数量可能不同,行的数量也可能不同 该表有1列,其中包含csv格式的值。这些值将始终是数字 Data 1,2 4 5,12, 10 6,7,8,9,10 15,17 我想以一个临时表结束,其中包含以下内容 Data Lowest Highest 1,2 1 2 4 4 4 5,12, 10

我在表格中有以下数据。每行中的值的数量可能不同,行的数量也可能不同

该表有1列,其中包含csv格式的值。这些值将始终是数字

Data
1,2
4
5,12, 10
6,7,8,9,10
15,17
我想以一个临时表结束,其中包含以下内容

Data           Lowest            Highest
1,2               1                  2
4                 4                  4
5,12, 10          5                  12
6,7,8,9,10        6                  10
15,17             15                 17 

任何人都可以帮助编写sql查询或函数来实现这一点吗?首先创建一个用户定义的函数,将每行“数据”列转换为中间表,如下所示:

Create table #temp1 (name varchar(100),value int )
Declare @len int
Select @len=(select max(LEN(name)-LEN(replace(name,',',''))) from table)
Declare @i int = 1 
while (@i<=@len+1)
begin
insert into #temp1
select name,PARSENAME(REPLACE(name,',','.'),@i) from table t 
set @i = @i+1

end

Select name,MIN(value) MINV,MAX(value) MAXV from #temp1 group by name
/****** Object:  UserDefinedFunction [dbo].[CSVToTable]******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[CSVToTable] (@InStr VARCHAR(MAX))
RETURNS @TempTab TABLE
   (id int not null)
AS
BEGIN
    ;-- Ensure input ends with comma
    SET @InStr = REPLACE(@InStr + ',', ',,', ',')
    DECLARE @SP INT
DECLARE @VALUE VARCHAR(1000)
WHILE PATINDEX('%,%', @INSTR ) <> 0 
BEGIN
   SELECT  @SP = PATINDEX('%,%',@INSTR)
   SELECT  @VALUE = LEFT(@INSTR , @SP - 1)
   SELECT  @INSTR = STUFF(@INSTR, 1, @SP, '')
   INSERT INTO @TempTab(id) VALUES (@VALUE)
END
    RETURN
END
GO

交叉应用的作用是:它将右表表达式应用于左表中的每一行,并生成一个具有统一结果集的结果表。

您可以通过此方法实现,而不是函数

 ;WITH tmp 
     AS (SELECT A.rn,split.a.value('.', 'VARCHAR(100)') AS String 
         FROM   (SELECT Row_number() OVER(ORDER BY (SELECT NULL)) AS RN, 
                        Cast ('<M>' + Replace([data], ',', '</M><M>') + '</M>' AS XML) AS String 
                 FROM   table1) AS A 
                CROSS apply string.nodes ('/M') AS Split(a)) 
SELECT X.data,Tmp.lower,Tmp.higher 
FROM   (SELECT rn,Min(Cast(string AS INT)) AS Lower,Max(Cast(string AS INT)) AS Higher 
        FROM   tmp 
        GROUP  BY rn) Tmp 
       JOIN (SELECT Row_number() OVER(ORDER BY (SELECT NULL)) AS RN1,data 
             FROM   table1) X 
         ON X.rn1 = Tmp.rn 

sql server还是mysql???@mmhasannn sql server请参考此内容,您能解释更多吗?您可以替换,使用UNION和have dynamic sql..我在temp表名中获取min和max值的最大值作为原始postcheck now jst最小更改执行它,u应该能够看到结果,而无需对结果中的所有最后一行进行任何更改min和max为空,但其他行min和max是正确的
 ;WITH tmp 
     AS (SELECT A.rn,split.a.value('.', 'VARCHAR(100)') AS String 
         FROM   (SELECT Row_number() OVER(ORDER BY (SELECT NULL)) AS RN, 
                        Cast ('<M>' + Replace([data], ',', '</M><M>') + '</M>' AS XML) AS String 
                 FROM   table1) AS A 
                CROSS apply string.nodes ('/M') AS Split(a)) 
SELECT X.data,Tmp.lower,Tmp.higher 
FROM   (SELECT rn,Min(Cast(string AS INT)) AS Lower,Max(Cast(string AS INT)) AS Higher 
        FROM   tmp 
        GROUP  BY rn) Tmp 
       JOIN (SELECT Row_number() OVER(ORDER BY (SELECT NULL)) AS RN1,data 
             FROM   table1) X 
         ON X.rn1 = Tmp.rn 
Data              Lower              Higher
1,2               1                  2
4                 4                  4
5,12, 10          5                  12
6,7,8,9,10        6                  10
15,17             15                 17 
declare @Testdata table (  Data varchar(max))
insert @Testdata select   '1,2'
insert @Testdata select   '4'
insert @Testdata select   '5,12, 10'
insert @Testdata select   '6,7,8,9,10'



;with tmp(  DataItem, Data, RN1) as (
select   LEFT(Data, CHARINDEX(',',Data+',')-1),
    STUFF(Data, 1, CHARINDEX(',',Data+','), ''),
    ROW_NUMBER()OVER(ORDER BY (SELECT NULL))AS RN1
from @Testdata
union all
select   LEFT(Data, CHARINDEX(',',Data+',')-1),
    STUFF(Data, 1, CHARINDEX(',',Data+','), ''),RN1
from tmp
where Data > ''
)

Select x.data,t.Low,t.Up FROM
 (Select RN1,MIN(Cast(DataItem AS INT)) As Low,
 MAX(Cast(DataItem AS INT)) As Up 
    FROM tmp t GROUP BY t.RN1)t
JOIN (Select ROW_NUMBER()OVER(ORDER BY (SELECT NULL))AS RN,data from @Testdata)X
ON X.RN = t.RN1