SQL:基于另一列聚合一列
我被这个问题难住了。我有一个交易表,上面有不同医生的交易。交易和医生之间存在多对多的关系(每笔交易可能有一名以上的医生)。我需要找到与给定用户纬度和经度最近的医生的交易。我有一个存储过程负责查找距离SQL:基于另一列聚合一列,sql,sql-server,Sql,Sql Server,我被这个问题难住了。我有一个交易表,上面有不同医生的交易。交易和医生之间存在多对多的关系(每笔交易可能有一名以上的医生)。我需要找到与给定用户纬度和经度最近的医生的交易。我有一个存储过程负责查找距离 Select d.dealID, do.doctorID, dbo.fn_latlongdist($userlat,$userlong,do.doctorLatitude,do.doctorLongitude) as distance From y_Deals d J
Select d.dealID, do.doctorID,
dbo.fn_latlongdist($userlat,$userlong,do.doctorLatitude,do.doctorLongitude) as distance
From y_Deals d
JOIN y_deals_doctor dd ON dd.dealID = d.dealID
JOIN Doctor do on dd.doctorID = do.doctorID
ORDER BY distance
现在我想按dealID分组,这样就不会返回多个交易。问题是我想返回最小距离的doctorID。似乎没有任何聚合函数围绕doctorID,返回具有最小距离列的doctorID
我应该如何处理这个问题?看看这是否适合您
Select * From
(
Select
d.dealID
, do.doctorID
, dbo.fn_latlongdist($userlat, $userlong, do.doctorLatitude, do.doctorLongitude) as Distance
, ROW_NUMBER() OVER (PARTITION BY d.dealID ORDER BY dbo.fn_latlongdist($userlat, $userlong, do.doctorLatitude, do.doctorLongitude)) AS RowNumber
From
y_Deals d
JOIN
y_deals_doctor dd ON dd.dealID = d.dealID
JOIN
Doctor do on dd.doctorID = do.doctorID
) T
Where
T.RowNumber = 1
更新:
;With AllData As
(
Select
d.dealID
, do.doctorID
, dbo.fn_latlongdist($userlat, $userlong, do.doctorLatitude, do.doctorLongitude) as Distance
, ROW_NUMBER() OVER (PARTITION BY d.dealID ORDER BY dbo.fn_latlongdist($userlat, $userlong, do.doctorLatitude, do.doctorLongitude)) AS RowNumber
From
y_Deals d
JOIN
y_deals_doctor dd ON dd.dealID = d.dealID
JOIN
Doctor do on dd.doctorID = do.doctorID
)
,DrCount As
(
Select
dealID
, Count(Distinct doctorID) as doctorCount
From
AllData
Group By
dealID
)
Select
*
From
AllData A
Inner Join
DrCount C
On
A.dealID = C.dealID
Where
A.RowNumber = 1
另一种选择是使用中讨论的技术。它不依赖于ROW_NUMBER(),这在很多DB引擎中都不可用 下面是一个示例,其中距离是医生表中的一列,而不是计算的函数。根据需要进行调整:
SELECT
Doctors.ID, DoctorName, Distance, DealName
FROM
(SELECT DealID, Min(Doc.Distance) as Dist
FROM DoctorDeals, Doctors as Doc
WHERE DoctorDeals.DoctorID = Doc.ID
GROUP BY DealID) as T,
DoctorDeals, Deals, Doctors
WHERE
T.Dist = Doctors.Distance
AND
T.DealID = DoctorDeals.DealID
AND
DoctorDeals.DoctorID = Doctors.ID
AND
DoctorDeals.DealID = Deals.ID
你不能选择最上面一行吗?选择Top 1…医生表是否包含有关其位置的一些信息?@amit_g我不想要Top 1,我想要一个按距离排列的交易列表,但我想知道每个交易的最近医生one@leslie如您所见,医生桌上有医生的经度和纬度。它也有我需要的医生的城市和州,我需要用这个应用程序输出。对于每个交易ID,你只需要一个医生ID,距离最小。当提供相同交易的两个博士拥有完全相同的距离(恰好是交易的最低距离)时会发生什么?这是有效的。是否有任何方法可以返回一个列,显示多少医生最初附属于该交易?