Sql 查询为表中的每个组合返回一条记录
Posted
技术标签:
【中文标题】Sql 查询为表中的每个组合返回一条记录【英文标题】:Sql query to return one single record per each combination in a table 【发布时间】:2012-05-05 20:54:43 【问题描述】:我需要 (from_id, to_id) 的每个组合的结果,它具有最小值和匹配条件的循环。
所以基本上我需要具有最小值的循环。例如从 A 到 B 我需要最小值和 loop_id。
该表有以下字段:
value from_id to_id loop_id
-------------------------------------
2.3 A B 2
0.1 A C 2
2.1 A B 4
5.4 A C 4
所以结果将是:
value from_id to_id loop_id
-------------------------------------
2.1 A B 4
0.1 A C 2
我尝试了以下方法:
SELECT t.value, t.from_id, t.to_id,t.loop_id
FROM myresults t
INNER JOIN (
SELECT min(m.value), m.from_id, m.to_id, m.loop_id
FROM myresults m where m.loop_id % 2 = 0
GROUP BY m.from_id, m.to_id, m.loop_id
) x
ON (x.from_id = t.from_id and x.to_id=t.to_id and x.loop_id=t.loop_id )
AND x.from_id = t.from_id and x.to_id=t.to_id and x.loop_id=t.loop_id
但它正在返回所有循环。 提前致谢!
【问题讨论】:
从内部派生表中删除 loop_id,因此也将连接到外部查询。然后它将返回每个组合的最小值,并且在外部查询中您可以找到适当的 loop_id。 嗨,Kaj,你有那个查询的例子吗?谢谢 @baboso 这个查询怎么样。SELECT min(value) as value, from_id, to_id from myresults group BY from_id,to_id
@viswanathan-iyer 您的查询将返回所有循环。这也不起作用: SELECT min(value) as value, from_id, to_id, loop_id from myresults where loop_id % 2 = 0 group BY from_id,to_id,loop_id
@baboso 那么你想要哪个 loop_id?
【参考方案1】:
据我了解,这将起作用:
SELECT t.value, t.from_id, t.to_id, t.loop_id
FROM MyResults t
INNER JOIN
( SELECT From_ID, To_ID, MIN(Value) [Value]
FROM MyResults
WHERE Loop_ID % 2 = 0
GROUP BY From_ID, To_ID
) MinT
ON MinT.From_ID = t.From_ID
AND MinT.To_ID = t.To_ID
AND MinT.Value = t.Value
但是,如果 From_ID 和 To_ID 组合的值重复,例如
value from_id to_id loop_id
-------------------------------------
0.1 A B 2
0.1 A B 4
这将返回两行。
如果您使用的是 SQL-Server 2005 或更高版本,并且您想要如上所述的重复行,您可以使用:
SELECT Value, From_ID, To_ID, Loop_ID
FROM ( SELECT *, MIN(Value) OVER(PARTITION BY From_ID, To_ID) [MinValue]
FROM MyResults
) t
WHERE Value = MinValue
如果你不想要重复的行,你可以使用这个:
SELECT Value, From_ID, To_ID, Loop_ID
FROM ( SELECT *, ROW_NUMBER() OVER(PARTITION BY From_ID, To_ID ORDER BY Value, Loop_ID) [RowNumber]
FROM MyResults
) t
WHERE RowNumber = 1
【讨论】:
从 A 到 B,min(value) 为 2.1,loop_id 为 4。您的查询返回连接 A-B 的磨损值和 loop_id 抱歉,我误解了标准。我认为我的编辑会对此进行排序。【参考方案2】:你不能更简单地做到这一点吗?
SELECT
from_id,
to_id,
MIN(value)
FROM
myresults
WHERE
loop_id % 2 = 0
GROUP BY
from_id,
to_id
或者我可能误解了这个问题。
编辑:包括 loop_id
SELECT
m2.from_id,
m2.to_id,
m2.value,
m2.loop_id
FROM
myresults m2 INNER JOIN
(SELECT
m1.from_id,
m1.to_id,
MIN(m1.value)
FROM
myresults m1
WHERE
m1.loop_id % 2 = 0
GROUP BY
m1.from_id,
m1.to_id) minset
ON
m2.from_id = minset.from_id
AND m2.to_id = minset.to_id
AND m2.value = minset.value
【讨论】:
问题是我还需要获取loop_id。所以这不起作用: SELECT from_id, to_id, MIN(value), loop_id FROM myresults WHERE loop_id % 2 = 0 GROUP BY from_id, to_id, loop_id 哦,没注意到结果中的loop_id。对不起,你是对的。将更新... 查看我对这个问题的评论 - 这得到了正确的行子集,但 OP 也希望查看 loop_id。因此,您需要一个外部查询来显示它,但不使用它来识别相关行 @baboso:您没有指定您使用的 rdbms。例如,如果您使用的是更高版本的 SQL Server,则可以使用 OUTER APPLY 大大简化此操作 您好您的查询正在运行,但不幸的是,如果值相同,则会返回具有不同 loop_id 的重复行。如果值重复,我如何过滤您的查询以仅返回一行(例如 max lopp_id)以上是关于Sql 查询为表中的每个组合返回一条记录的主要内容,如果未能解决你的问题,请参考以下文章
SQL - 为表中的每个货币代码(在两个定义的日期之间)创建一个具有唯一日期和货币记录的表
Python查询sql db中的最后一条记录,但返回空白记录