SQL检索不在聚合或分组中的列
好的,我表示一个表中有三列的矩阵。为了简单起见:列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行也有最小值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
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)