一直以为对SQL中group by 语句都有畏惧感,主要是用的太少,最近同学让我帮忙写个sql,竟然当时没写出来,挺丢人的,都工作那么就了。
现在我开始认真想了下,总结如下问题及sql语句:
问题是这样的:
如上图, 统计每个点(或人)中最出测量值和最末测量值,并求差。
效果如下:
首先建表(随便拿以前的表来改的),字段如下:
其中room_id 为主键代表序号,
Waiter_name 就是点名,我这里用人名代替,
Start_time 就是测量时间吧
End_time先别管了,
By1就是测量值。
这里需要将同一张表作为两张表看,做一次联合查询,然后用group by 分组,使用分组要仔细考虑分完的组内的都是那些字段构成的,不要忽略了隐含的字段(连接查询时是做的笛卡尔积运算)
=========================================
select tt.waiter_name 点名,min(tt.start_time) 第一次的测量时间,max(tt.start_time)最后一次的测量时间,min(tt.by1) 第一次测量值,max(tt.by1) 最后一次测量值,max(tt.by1)-min(tt.by1)差值
from(
select a.room_id,a.waiter_name,a.start_time,a.by1 from waiters a,waiters b
where a.waiter_name = b.waiter_name
group by a.room_id,a.waiter_name,a.start_time,a.by1
having a.start_time<=min(b.start_time) or a.start_time >=max(b.start_time)
order by a.waiter_name
) tt
group by tt.waiter_name;