SQL Server Query - PullRequest
       2

SQL Server Query

0 голосов
/ 02 марта 2012

Я хочу пойти отсюда:

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 я хочу получить максимум, минимум данных, дату в днях, а сложная часть для меня - это разность значений, связанных с датой, создание значений потребления в диапазоне.

Ответы [ 4 ]

1 голос
/ 02 марта 2012
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

Надеюсь, это, по крайней мере, укажет вам правильное направление. Сделайте два подзапроса, один для максимального и один для минимального, а затем объедините данные с выбором из этих двух запросов.

0 голосов
/ 27 августа 2017

Кроме столбцов ' days ' и 'потреблено', выведите результат, используя group by в качестве CTE,

 With cte as
 (
 Select id_hw, min (data) Mindata,max(data) maxdata,
 From Maintable
 Group by Id_hw
)

Затем добавьте коррелированный подзапрос в операторе select прохода CTEId_hw и max date, чтобы получить максимальное значение lampada для id_hw, аналогично передайте 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
0 голосов
/ 02 марта 2012

Кажется, что более низкие значения всегда связаны с более ранними датами и наоборот.Так что вы можете сделать что-то вроде этого:

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
0 голосов
/ 02 марта 2012
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...