Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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_Greatest N Per Group - Fatal编程技术网

SQL检索不在聚合或分组中的列

SQL检索不在聚合或分组中的列,sql,sql-server,greatest-n-per-group,Sql,Sql Server,Greatest N Per Group,好的,我表示一个表中有三列的矩阵。为了简单起见:列A、B和值。A和B表示矩阵的X和Y坐标 有人能帮我解决以下问题吗 对于矩阵X中的每一列,我希望检索最小值和Y坐标字段,它表示X列中的最小值 这适用于矩阵中的每列/X 我一直在努力,因为我不能在group by或聚合函数中包含Y,所以它不允许我在计算最小值X是group by'd的同一查询中返回Y 编辑如果有两行或更多行,则应返回最小Y值 因此,我的表是: Y | X |值 0 | 0 | 0.38 1 | 0 | 0.72 2 | 0 | 0.1

好的,我表示一个表中有三列的矩阵。为了简单起见:列A、B和值。A和B表示矩阵的X和Y坐标

有人能帮我解决以下问题吗

对于矩阵X中的每一列,我希望检索最小值和Y坐标字段,它表示X列中的最小值

这适用于矩阵中的每列/X

我一直在努力,因为我不能在group by或聚合函数中包含Y,所以它不允许我在计算最小值X是group by'd的同一查询中返回Y

编辑如果有两行或更多行,则应返回最小Y值

因此,我的表是:

Y | X |值

0 | 0 | 0.38

1 | 0 | 0.72

2 | 0 | 0.13

3 | 0 | 0.45

0 | 1 | 0.52

1 | 1 | 0.23

2 | 1 | 0.84

3 | 1 | 0.15

0 | 2 | 0.52

1 | 2 | 0.04

2 | 2 | 0.04

3 | 2 | 0.15

根据上述测试数据,它应返回:

X | Y |值

0 | 2 | 0.13

1 | 3 | 0.15

2 | 1 | 0.04

请注意,在Y=2时,第1行是最小的Y,即使第2行也有最小值

SELECT  y ,
        ( SELECT    MIN(x)
          FROM      user997112 i
          WHERE     i.Y = o.y
                    AND i.VALUE = o.VALUE
        ) AS x ,
        value
FROM    ( SELECT    y ,
                    MIN(VALUE) AS value
          FROM      dbo.user997112
          GROUP BY  y
        ) AS o
这是我使用的模式

CREATE TABLE [dbo].[user997112](
    [x] [int] NULL,
    [y] [int] NULL,
    [VALUE] [decimal](5, 2) NULL
) 
GO
INSERT [dbo].[user997112] ([x], [y], [VALUE]) VALUES (0, 0, CAST(0.38 AS Decimal(5, 2)))
INSERT [dbo].[user997112] ([x], [y], [VALUE]) VALUES (1, 0, CAST(0.72 AS Decimal(5, 2)))
INSERT [dbo].[user997112] ([x], [y], [VALUE]) VALUES (2, 0, CAST(0.13 AS Decimal(5, 2)))
INSERT [dbo].[user997112] ([x], [y], [VALUE]) VALUES (3, 0, CAST(0.45 AS Decimal(5, 2)))
INSERT [dbo].[user997112] ([x], [y], [VALUE]) VALUES (0, 1, CAST(0.52 AS Decimal(5, 2)))
INSERT [dbo].[user997112] ([x], [y], [VALUE]) VALUES (1, 1, CAST(0.23 AS Decimal(5, 2)))
INSERT [dbo].[user997112] ([x], [y], [VALUE]) VALUES (2, 1, CAST(0.84 AS Decimal(5, 2)))
INSERT [dbo].[user997112] ([x], [y], [VALUE]) VALUES (3, 1, CAST(0.15 AS Decimal(5, 2)))
INSERT [dbo].[user997112] ([x], [y], [VALUE]) VALUES (0, 2, CAST(0.52 AS Decimal(5, 2)))
INSERT [dbo].[user997112] ([x], [y], [VALUE]) VALUES (1, 2, CAST(0.04 AS Decimal(5, 2)))
INSERT [dbo].[user997112] ([x], [y], [VALUE]) VALUES (2, 2, CAST(0.04 AS Decimal(5, 2)))
INSERT [dbo].[user997112] ([x], [y], [VALUE]) VALUES (3, 2, CAST(0.15 AS Decimal(5, 2)))

这里有一种方法,但很笨拙:

SELECT X, MIN(Y), Value 
FROM your_table fullTable   
WHERE Value <= ALL (SELECT Value FROM your_table WHERE X = fullTable.X)  
GROUP BY X, Value
您可以在以下位置进行测试: 更正以反映问题中更改的数据:

x,value,y上的索引对性能很有用。

类似

SELECT Test.X, Test.Y, MAX(Test.Value) AS Value FROM Test 
INNER JOIN (
SELECT DISTINCT X, MIN(Y) AS Y FROM Test
GROUP BY X) t 
ON Test.X = t.X AND Test.Y = t.Y 
GROUP BY Test.X, Test.Y

基本上:首先做一个子查询,以得到X与最小Y的组合,然后将其连接到原始表,以获得相应的值

我希望我能准时到达

Select t1.A,
    min(t1.B),
    t1.value 
from `table` t1, 
 (SELECT MIN( value ) AS value, a
  FROM  `table` 
  GROUP BY (A)) `t2`
where t1.A = t2.A
group by (t1.a)

首先给出A的最小值,然后按B分组,如果一列有两行或更多行具有相同的最小值,该怎么办?@ypercube谢谢,我忘了包括这一部分!看起来你显示的结果是按y分组,然后得到最小值和最小x,如果是平局。您的描述是Other方法。@ypercube,不,我只是在结果中首先显示了Y列:X=0的列的结果在哪里?他想在table@user997112好的,现在有道理了。答案是更新,应该给你你需要的。让我知道是怎么回事goes@buckley-我认为这不会起作用,除非最小值出现在元组中,并且具有最小的Y值。例如:X/Y/value={0,0,5},{0,2,2}@Mark,我在我的问题中犯了一个小错误。请查看交换的X和Y列。需要几处更正。提示:您没有在任何地方使用t2.value。抱歉,忘记了该值
SELECT Test.X, Test.Y, MAX(Test.Value) AS Value FROM Test 
INNER JOIN (
SELECT DISTINCT X, MIN(Y) AS Y FROM Test
GROUP BY X) t 
ON Test.X = t.X AND Test.Y = t.Y 
GROUP BY Test.X, Test.Y
Select t1.A,
    min(t1.B),
    t1.value 
from `table` t1, 
 (SELECT MIN( value ) AS value, a
  FROM  `table` 
  GROUP BY (A)) `t2`
where t1.A = t2.A
group by (t1.a)