2011-03-25 90 views
1

我很难以看到这个查询。我有一个交易表为不同的医生交易。交易和医生之间有多对多的交易(每笔交易可能有超过一名医生)。我需要找到最接近医生的交易,以给定用户的经度和纬度。我有一个存储过程,负责查找距离。SQL:基于另一个列聚合一列

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。

我该如何解决这个问题?

+1

难道你不能只选择顶行吗?选择Top 1 ... – 2011-03-25 17:09:12

+0

医生表是否包含有关其位置的一些信息? – Leslie 2011-03-25 17:09:14

+0

@amit_g我不想要只有顶部1,我想要一个距离交易列表,但我想知道最接近的每个医生 – DannyLeavitt 2011-03-25 17:11:41

回答

1

看看这对你的作品

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 

UPDATE:

;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 
+0

这个工程。有没有什么办法可以返回一列,显示最初有多少医生被纳入交易? – DannyLeavitt 2011-03-25 19:44:12

+0

更新了代码。再次确保正确测试。 – 2011-03-25 19:55:57

+0

哇,这个作品。非常感谢!运行速度也很快。 – DannyLeavitt 2011-03-25 21:16:24

0

另一种选择是使用http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/讨论的技术。它不依赖于ROW_NUMBER(),它不适用于很多数据库引擎。

下面是一个示例,其中distance是医生表中的列而不是计算的函数。根据需要调整:

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