【问题标题】:Exposing more fields on group by sql通过 sql 在 group 上公开更多字段
【发布时间】:2014-07-08 14:22:47
【问题描述】:

我知道,在 Group By 中,您不能在 Select 中使用不在聚合函数或 GROUP BY 子句中的字段。

但是,必须有一个使用连接或其他方法的解决方法。

我有两个表 BMP_VISITS_SITES 和 BMP_VISITS_COMMENTS,它们通过 StationID 以一对多的关系连接。一个站点可以有多个 cmets。

我正在尝试编写一个返回所有站点和最新(仅 1 条)评论的查询。我有一个“工作”查询,但它只返回两个列,它们位于聚合函数或分组依据中。

这是我的“工作”查询:

select          a.StationID, 
                MAX(b.[dateobserved]) as LastDateObserved,
                a.Status
from            BMP_VISITS_SITES a
left outer join BMP_VISITS_COMMENTS as b 
on a.[StationID] = b.[StationID]
group by a.StationID;

但是如何访问两个表中的所有列?

我已经尝试了 1/2 成功的内部联接。当我将 BMP_VISITS_SITES 加入到上述查询中时,我得到了表 (t1) 的所有字段。太好了,但是一旦我尝试加入 BMP_VISITS_COMMENTS (t3),我得到的结果比我应该得到的要多。

select          t1.*, t2.*
                --,t3.* 
                from BMP_VISITS_SITES t1
inner join (
        select a.StationID, MAX(b.[dateobserved]) as LastDateObserved from BMP_VISITS_SITES a
        left outer join BMP_VISITS_COMMENTS as b 
        on a.[StationID] = b.[StationID]
        group by a.StationID
) t2 on t2.StationID = t1.StationID
--inner join sde.BMP_VISITS_COMMENTS t3 on t3.StationID = t2.StationID;

【问题讨论】:

标签: sql sql-server


【解决方案1】:
SELECT a.*, b.* FROM
BMP_VISITS_SITES a
OUTER APPLY
(
    SELECT TOP 1 *
    FROM BMP_VISITS_COMMENTS b
    WHERE b.StationID = a.StationID
    ORDER BY LastDateObserved DESC
) b

您可以使用apply获取最后一条评论记录,并返回查询两边的所有字段。

【讨论】:

  • 哇,干净,简短,有效且简单的天才。我必须学习一个新技巧“外部应用”谢谢!
【解决方案2】:

使用row_number()

select * 
from 
(
    select          a.StationID, 
                    a.Status,
                    b.*,
                    row_number() over (partition by a.stationid, a.status order by b.[dateobserved] desc) as rn
    from            BMP_VISITS_SITES a
    left outer join BMP_VISITS_COMMENTS as b 
    on a.[StationID] = b.[StationID]
) v
where rn = 1

【讨论】:

    猜你喜欢
    • 2010-11-19
    • 2019-05-25
    • 1970-01-01
    • 2021-01-11
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多