我有三个桌子Campaign
,Mall
,MallCampaign
(多到多),并希望订购最近的活动,可在一个或多个商场。
在第一个查询中,我有资格到达不同商场的活动距离。但所有的竞选活动都需要这样做,而不仅仅是一个(Id=79)。我没法用JOIN来做这件事。
SELECT
m.MallId,
ROUND(@geo1.STDistance(geography::Point(m.MallLatitude, m.MallLongitude, 4326))/1000,1) AS Distance
FROM
MallCampaign mc
INNER JOIN
Mall m ON m.MallId = mc.MallId
WHERE
m.IsActive != 0 AND mc.CampaignId = 79
ORDER BY
Distance
SELECT
ca.CampaignId, ca.CampaignTitle
FROM
Campaign ca
发布于 2013-07-27 12:22:38
这能做你想做的事吗?它首先按活动编号排序,然后按距离排序:
SELECT mc.CampaignId, m.MallId,
ROUND(@geo1.STDistance(geography::Point(m.MallLatitude, m.MallLongitude, 4326))/1000,1) AS Distance
FROM MallCampaign mc join
Mall m
ON m.MallId = mc.MallId
WHERE m.IsActive <> 0
ORDER BY mc.CampaignId, Distance;
编辑:
你最初的问题中没有一个top
,这是我所期望的。要处理这个问题,您需要使用row_number()
。在这种情况下,最容易执行两个子查询(或CTE):
select CampaignId, MallId, Distance
from (select mc.*,
row_number() over (partition by CampaignId order by distance) as seqnum
from (SELECT mc.CampaignId, m.MallId,
ROUND(@geo1.STDistance(geography::Point(m.MallLatitude, m.MallLongitude, 4326))/1000,1) AS Distance
FROM MallCampaign mc join
Mall m
ON m.MallId = mc.MallId
WHERE m.IsActive <> 0
) mc
) mc
where seqnum = 1;
https://stackoverflow.com/questions/17897590
复制相似问题