Sql server SQL Server查询
我想从这里开始:Sql server SQL Server查询,sql-server,sql-server-2008-r2,Sql Server,Sql Server 2008 R2,我想从这里开始: ID ID_HW DATA LAMPADA 305 3517 02-02-2012 00:00 1208 277 3517 30-12-2011 00:00 1127 179 3517 06-12-2011 00:00 1092 134 3517 03-11-2011 00:00 962 89 3517 06-10-2011 00:00 851 69 3517 07-09-2011 00:00
ID ID_HW DATA LAMPADA
305 3517 02-02-2012 00:00 1208
277 3517 30-12-2011 00:00 1127
179 3517 06-12-2011 00:00 1092
134 3517 03-11-2011 00:00 962
89 3517 06-10-2011 00:00 851
69 3517 07-09-2011 00:00 786
42 3517 25-08-2011 00:00 786
306 3518 02-02-2012 00:00 2082
250 3518 30-12-2011 00:00 2045
180 3518 06-12-2011 00:00 2004
163 3518 08-11-2011 00:00 1695
90 3518 06-10-2011 00:00 1516
68 3518 07-09-2011 00:00 1426
43 3518 25-08-2011 00:00 1315
307 3519 02-02-2012 00:00 482
251 3519 02-01-2012 00:00 375
181 3519 06-12-2011 00:00 347
137 3519 07-11-2011 00:00 229
91 3519 06-10-2011 00:00 92
67 3519 07-09-2011 00:00 2305
44 3519 25-08-2011 00:00 2304
到这里:
ID_HW MINDATA MAXDATA _DAYS_ CONSUMED
3517 25-08-2011 00:00 02-02-2012 00:00 161 422
3518 25-08-2011 00:00 02-02-2012 00:00 161 767
3519 25-08-2011 00:00 02-02-2012 00:00 161 -1822
注意:对于每个id_hw,我需要数据的最大值、最小值、datediff(以天为单位),我的困难部分是对与日期关联的值进行差异化,创建范围内的消耗值
SELECT ID_HW,
minTable.DATA as MINDATA,
maxTable.DATA as MAXDATA,
(maxTable.DATA - minTable.DATA) as _DAYS_,
(maxTable.LAMPDA - minTable.LAMPDA) as consumed
from (SELECT ID_HW, MAX(data) as DATA, LAMPDA from table group by ID_HW) maxTable,
(SELECT ID_HW, MIN(DATA) as DATA, LAMPDA from table group by ID_HW) minTable
where maxTable.ID_HW = minTable.ID_HW
希望这至少为你指明了正确的方向。进行两个子查询,一个用于最大值,一个用于最小值,然后将数据与这两个查询中的select组合起来。看起来较低的值总是与较早的日期关联,反之亦然。所以你可以这样做:
SELECT ID_HW, MINTABLE.DATA AS MINDATA, MAXTABLE.DATA AS MAXMINDATA, (MAXTABLE.DATA - MINTABLE.DATA) AS DAYS, (MAXTABLE.LAMPADA - MINTABLE.LAMPADA) AS CONSUMED
FROM TABLE,
SELECT ID_HW, MIN(data) AS DATA, LAMPADA
FROM Table
HAVING MIN(data) = data) AS MINTABLE,
(SELECT ID_HW, MAX(data) AS DATA, LAMPADA
FROM Table
HAVING MAX(data) = data) AS MAXTABLE
WHERE TABLE.ID_HW = MINTABLE.ID_HW
WHERE TABLE.ID_HW = MAXTABLE.ID_HW
SELECT
ID_HW,
MINDATA = MIN(DATA),
MAXDATA = MAX(DATA),
_DAYS_ = DATEDIFF(DAY, MIN(DATA), MAX(DATA)),
CONSUMED = MAX(LAMPADA) - MIN(LAMPADA)
FROM yourtable
GROUP BY
ID_HW
除“天”和“消耗”列外,使用group by作为CTE取出结果
With cte as
(
Select id_hw, min (data) Mindata,max(data) maxdata,
From Maintable
Group by Id_hw
)
然后在CTE pass Id_hw和max date的select语句中添加一个相关子查询,以获取Id_hw的lampada的最大值,类似地,pass Id_hw和min date,现在取它们之间的差值
Select *,datediff(day,Maxdata,Mindata)[_days_],
(select lampada from maintable where id_hw=CTE.id_hw and date=CTE.Maxdata)-(select lampada from maintable where id_hw=CTE.id_hw and date=CTE.Mindata) Consumed
from cte
我想是ID_HW、maxDATA、minDATA组成的小组?谢谢,通过一点头脑风暴我到达了那里!最终的解决方案是:选择MINTABLE.ID_HW作为ID_HW,MINTABLE.DATA作为MINDATA,MAXTABLE.DATA作为MAXDATA,DATEDIFFDAY,MINTABLE.DATA,MAXTABLE.DATA作为_DAYS,consumered=从表中选择LAMPADA,其中ID=MAXTABLE.ID-从表中选择LAMPADA,其中ID=MINTABLE.ID从选择MAXID作为ID,ID_HW,MAXDATA作为来自表GROUP BY ID的数据\u HW作为MAXTABLE,选择MINID作为ID,ID\u HW,MINDATA作为来自表GROUP BY ID的数据\u HW作为MINTABLE,其中MAXTABLE.ID\u HW=MINTABLE.ID\u HW