SQLServer知识点(+)

SQLServer中GO的注意点

如果只是执行一条语句,有没有GO都一样

如果多条语句之间用GO分隔开就不一样了

每个被GO分隔的语句都是一个单独的事务,一个语句执行失败不会影响其它语句执行。

例如:

首先同时执行下边的语句

select * from sysobjects where id=a

select getdate()

你会发现会报错,并且不会显示任何结果集

而你再执行

select * from sysobjects where id=a

go

select getdate()

go

你会发现尽管同样会报错,但结果集中包含select getdate()的结果。

两个SQL语句的差值

一段时间之内,最早时间的值与最晚时间的值得差

select value,max(time)-min(time) from D_live_data where field_id=156 group by value
select t1.value-t2.value
from
(select top1 value from D_live_data where  field_id=156 order by time) t1,
(select top1 value from D_live_data where  field_id=156 order by time desc) t2

Sql如何数据库求相邻两行的差值?

现有表table

----------------------------------------------------------
年	      月   	日	   气温
2009	  1	    1	     6.8
2009	  1	    2	     6.1
2009	  1	    3	     5.6
2009	  1	   4	     4.7
2009	  1	   5	     4
2009	  1	   6	     3
2009	  1	   7	     4.5
2009	  1	   8	     8.9
2009	  1	   9	     11.2
2009	  1	  10	     8.7
---------------------------------------------------------
通过运算求相邻两列行中“气温”的差值,即得到以下表:
----------------------------------------------------------
年	      月   	日	   气温     与昨日温差
2009	  1	    1	     6.8  
2009	  1	    2	     6.1        -0.7
2009	  1	    3	     5.6        -0.5
2009	  1	   4	     4.7        -0.9
2009	  1	   5	     4            -0.7
2009	  1	   6	     3            -1
2009	  1	   7	     4.5        1.5
2009	  1	   8	     8.9         4.4
2009	  1	   9	     11.2       2.3
2009	  1	  10	     8.7        -2.5
---------------------------------------------------------
WITH test (,,,气温) AS (
    SELECT 2009,1,1,6.8 UNION ALL
    SELECT 2009,1,2,6.1 UNION ALL
    SELECT 2009,1,3,5.6 UNION ALL
    SELECT 2009,1,4,4.7 UNION ALL
    SELECT 2009,1,5,4 UNION ALL
    SELECT 2009,1,6,3 UNION ALL
    SELECT 2009,1,7,4.5 UNION ALL
    SELECT 2009,1,8,8.9 UNION ALL
    SELECT 2009,1,9,11.2 UNION ALL
    SELECT 2009,1,10,8.7
)
SELECT t1.*,
       t1.气温 - t0.气温 与昨日温差
  FROM test t1
LEFT JOIN test t0
       ON DATEDIFF(day, 
                   DateAdd(day,t0.-1,DateAdd(month,t0.-1,DateAdd(year,t0.-1900,'1900-01-01'))),
                   DateAdd(day,t1.-1,DateAdd(month,t1.-1,DateAdd(year,t1.-1900,'1900-01-01')))
                  ) = 1
WITH test (,,,气温) AS (
    SELECT 2009,1,1,6.8 UNION ALL
    SELECT 2009,1,2,6.1 UNION ALL
    SELECT 2009,1,3,5.6 UNION ALL
    SELECT 2009,1,4,4.7 UNION ALL
    SELECT 2009,1,5,4 UNION ALL
    SELECT 2009,1,6,3 UNION ALL
    SELECT 2009,1,7,4.5 UNION ALL
    SELECT 2009,1,8,8.9 UNION ALL
    SELECT 2009,1,9,11.2 UNION ALL
    SELECT 2009,1,10,8.7
)
select  a.*,b.气温-a.气温 as 与昨日温差
from
   (select *,row_number()over(order by getdate()) as id from test) as a
inner join
   (select *,row_number()over(order by getdate()) as id from test) as b
on
   a.id=b.id-1

在这里插入图片描述

用SQL语句直接得出两个记录之间某字段的差值。

现有如下记录:

序号 表号 购电次数 剩余电量 总购电量 总用电量 
  1  22      1        33      2345    2312 
  2  22      2        23      3453    3430 
  3  22      3        243     3998    3755  
  4  22      4        36      4896    4850 
  4  22      5        76      5476    5400 

通过SQL语句 根据提供的购电次数信息 直接计算出某两次购电之间的用电量,例如第4次购电和第3次购电之间 用电量为 4850-3755 =1095度。

方法一

WITH test (序号,表号,购电次数,剩余电量,总购电量,总用电量) AS (
    SELECT 1,22,1,33,2345,2312 UNION ALL
    SELECT 2,22,2,23,3453,3430 UNION ALL
    SELECT 3,22,3,243,3998,3755 UNION ALL
    SELECT 4,22,4,36,4896,4850 UNION ALL
    SELECT 4,22,5,76,5476,5400
) 
  
SELECT Sum([总用电量] * ( CASE [购电次数] 
                                WHEN 3 THEN -1 
                                WHEN 4 THEN 1 
                              END )) 
FROM   test 
WHERE  [购电次数] = 3 OR [购电次数] = 4 

方法二

WITH test (序号,表号,购电次数,剩余电量,总购电量,总用电量) AS (
    SELECT 1,22,1,33,2345,2312 UNION ALL
    SELECT 2,22,2,23,3453,3430 UNION ALL
    SELECT 3,22,3,243,3998,3755 UNION ALL
    SELECT 4,22,4,36,4896,4850 UNION ALL
    SELECT 4,22,5,76,5476,5400
) 
select B.总用电量-A.总用电量 from 
(select * from test where 购电次数=3) A,
(select * from test where 购电次数=4) B
where A.表号=B.表号

方法三

WITH test (序号,表号,购电次数,剩余电量,总购电量,总用电量) AS (
    SELECT 1,22,1,33,2345,2312 UNION ALL
    SELECT 2,22,2,23,3453,3430 UNION ALL
    SELECT 3,22,3,243,3998,3755 UNION ALL
    SELECT 4,22,4,36,4896,4850 UNION ALL
    SELECT 4,22,5,76,5476,5400
) 

--全部数据
--SELECT a.*,(a.总用电量 - b.总用电量 ) as 用电量 
--from test a left join test b
--on a.购电次数=b.购电次数+1 and a.表号=b.表号

--第4次购电:
SELECT a.*,(a.总用电量 - b.总用电量 ) as 用电量 
from test a left join test b
on a.购电次数=b.购电次数+1 and a.表号=b.表号
where  a.购电次数=4 and a.表号=22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值