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中的最后一条记录,但返回空白记录

VBA Access SQL SELECT查询只返回一条记录

SQL查询将列值显示为表中的列名

SQL 查询将多条记录中的值组合到单个列中

优化 SQL 查询以返回带有标签的记录