Sql 在两列(分别)上显示Distinct,在另一列上显示MIN
我已经试着把这个问题一笔勾销了;我希望我仍然抓住了我试图在原始查询中实现的本质Sql 在两列(分别)上显示Distinct,在另一列上显示MIN,sql,sql-server,tsql,distinct,Sql,Sql Server,Tsql,Distinct,我已经试着把这个问题一笔勾销了;我希望我仍然抓住了我试图在原始查询中实现的本质 可以找到生成表和数据的代码 SQL风格是Microsoft SQL Server 2000(尽管我一直在MySQL上运行这个精简的测试用例) 原始表格 +-----------+----------+----------+ | master_id | slave_id | distance | +-----------+----------+----------+ | 1 | 1 |
- 可以找到生成表和数据的代码
- SQL风格是Microsoft SQL Server 2000(尽管我一直在MySQL上运行这个精简的测试用例)
+-----------+----------+----------+
| master_id | slave_id | distance |
+-----------+----------+----------+
| 1 | 1 | 0.1 |
| 1 | 3 | 10 |
| 2 | 2 | 3 |
| 3 | 2 | 2 |
+-----------+----------+----------+
+-----------+----------+----------+
| master_id | slave_id | distance |
+-----------+----------+----------+
| 1 | 1 | 0.1 |
| 3 | 2 | 2 |
+-----------+----------+----------+
所需内容的说明
我想选择slave\u id
master\u id
配对MIN(distance)
,不重复master\u id
或slave\u id
所需结果表
+-----------+----------+----------+
| master_id | slave_id | distance |
+-----------+----------+----------+
| 1 | 1 | 0.1 |
| 1 | 3 | 10 |
| 2 | 2 | 3 |
| 3 | 2 | 2 |
+-----------+----------+----------+
+-----------+----------+----------+
| master_id | slave_id | distance |
+-----------+----------+----------+
| 1 | 1 | 0.1 |
| 3 | 2 | 2 |
+-----------+----------+----------+
我的尝试
SELECT
join_table.master_id,
join_table.slave_id,
join_table.distance
FROM join_table
INNER JOIN
(
SELECT
slave_id,
MIN(distance) AS distance
FROM join_table
GROUP BY slave_id
) AS self_join
ON self_join.slave_id = join_table.slave_id
AND self_join.distance = join_table.distance
我的尝试有什么问题
SELECT
join_table.master_id,
join_table.slave_id,
join_table.distance
FROM join_table
INNER JOIN
(
SELECT
slave_id,
MIN(distance) AS distance
FROM join_table
GROUP BY slave_id
) AS self_join
ON self_join.slave_id = join_table.slave_id
AND self_join.distance = join_table.distance
此查询生成master\u id
非常感谢您的帮助。如果我没弄错,我会做以下几点:
SELECT DISTINCT t.master_id
,t.slave_id
,t.distance
FROM your_table t
INNER JOIN
(
SELECT master_id id, min(distance) distance
FROM your_table
GROUP BY master_id
UNION
SELECT slave_id id, min(distance) distance
FROM your_table
GROUP BY slave_id
) sub
ON (sub.id = t.master_id AND sub.distance = t.distance)
OR (sub.id = t.slave_id AND sub.distance = t.distance)
这将给出正确的结果:
select distinct t.master_id,
t.slave_id,
t.distance
from join_table t
inner join
(
SELECT ID, min(Distance) dist
FROM
(
SELECT master_ID ID, MIN(distance) AS Distance
FROM join_table
GROUP BY master_ID
UNION
SELECT slave_ID ID, MIN(distance) AS Distance
FROM join_table
GROUP BY slave_ID
) src
GROUP BY ID
) md
on t.distance = md.dist
and (t.master_id = md.id or t.slave_id = md.id)
参见如何筛选出
主id
2而不是主id
3?什么是“主id或从id都不重复”?什么违反了这一要求?@MattBusche的最小距离(distance)requirement@bluefeet抱歉-我已经添加了我的attempt@rgvcorley . . . 这看起来更像是一个优化问题,而不是一个查询问题。当两个具有相同id的行具有相同的最小值时会发生什么情况?请注意,但看起来我必须找到一种方法来获取表的本地副本以运行查询-所讨论的表具有>1亿条记录,并且没有关于距离的索引。。。不用说3小时的查询时间限制是不够的。。。