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,距离最小。当提供相同交易的两个博士拥有完全相同的距离(恰好是交易的最低距离)时会发生什么?这是有效的。是否有任何方法可以返回一个列,显示多少医生最初附属于该交易?