Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 выборка по 1 дню месяца  [new]
artgot
Member

Откуда:
Сообщений: 15
Коллеги, мучаюсь с запросом, подскажите куда копать.

Есть таблица:

Дата-------------------Показания
1.06.2016 00:00-----10
1.06.2016 01:00-----11
1.06.2016 02:00-----15
1.06.2016 03:00-----16
...
2.06.2016 00:00-----2
2.06.2016 01:00-----3
2.06.2016 02:00-----6
2.06.2016 03:00-----6
...
...
30.06.2016 00:00-----21
30.06.2016 01:00-----33
30.06.2016 02:00-----36
30.06.2016 03:00-----45
...

Необходимо получить таблицу:

Дата-------------------Показания
1.06.2016 23:00-----40
2.06.2016 23:00-----19
...
30.06.2016 23:00-----100

Т.е. из каждого дня месяца взять последнюю запись и вывести в одну таблицу.
25 июн 16, 21:38    [19336064]     Ответить | Цитировать Сообщить модератору
 Re: выборка по 1 дню месяца  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
artgot,

по-моему, вы пропустили в школе арифметику.
Или не можете объяснить по-человечески, что требуется получить.
25 июн 16, 21:47    [19336097]     Ответить | Цитировать Сообщить модератору
 Re: выборка по 1 дню месяца  [new]
artgot
Member

Откуда:
Сообщений: 15
iap,

каждый час записываются показания, мне надо сформировать таблицу, где будут только последние показания каждого дня, т.е. всего 30 записей.
25 июн 16, 22:12    [19336170]     Ответить | Цитировать Сообщить модератору
 Re: выборка по 1 дню месяца  [new]
3unknown
Member

Откуда: New York
Сообщений: 140
declare @values table(t_date datetime,value int)

insert @values
select '20160601 00:00',10
union
select '20160601 01:00',11
union
select '20160601 02:00',15
union
select '20160601 03:00',16
union
select '20160602 00:00',2
union
select '20160602 01:00',3
union
select '20160602 02:00',6
union
select '20160602 03:00',6
union
select '20160630 00:00',21
union
select '20160630 01:00',33
union
select '20160630 02:00',36
union
select '20160630 03:00',45


select top 1 with ties *
from @values
order by row_number() over (partition by year(t_date),month(t_date),day(t_date) order by datepart(hour,t_date) desc,datepart(minute,t_date) desc)
26 июн 16, 00:11    [19336394]     Ответить | Цитировать Сообщить модератору
 Re: выборка по 1 дню месяца  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
artgot
iap,

каждый час записываются показания, мне надо сформировать таблицу, где будут только последние показания каждого дня, т.е. всего 30 записей.
Зачем эта околесица в первом посте, если она не соответствует описанию?
26 июн 16, 11:59    [19336681]     Ответить | Цитировать Сообщить модератору
 Re: выборка по 1 дню месяца  [new]
artgot
Member

Откуда:
Сообщений: 15
3unknown, спасибо большое, заработало.

Понимаю, что надо было заранее полностью формулировать задачу, ещё вопрос:

Как добавить в полученную выборкой таблицу первую запись за день? Т.е. чтобы в строчке была первая запись и последняя запись.
30 июн 16, 16:35    [19355849]     Ответить | Цитировать Сообщить модератору
 Re: выборка по 1 дню месяца  [new]
3unknown
Member

Откуда: New York
Сообщений: 140
declare @values table(t_date datetime,value int)

insert @values
select '20160601 00:00',10
union
select '20160601 01:00',11
union
select '20160601 02:00',15
union
select '20160601 03:00',16
union
select '20160602 00:00',2
union
select '20160602 01:00',3
union
select '20160602 02:00',6
union
select '20160602 03:00',6
union
select '20160630 00:00',21
union
select '20160630 01:00',33
union
select '20160630 02:00',36
union
select '20160630 05:00',45

select  convert(varchar(8),a.t_date,112) as date
		,a.t_date as first_date
		,b.t_date as last_date
		,a.value as first_value
		,b.value as last_value
from(
select top 1 with ties *
from @values
order by row_number() over (partition by year(t_date),month(t_date),day(t_date) order by datepart(hour,t_date) asc,datepart(minute,t_date) asc)
) a
join(
select top 1 with ties *
from @values
order by row_number() over (partition by year(t_date),month(t_date),day(t_date) order by datepart(hour,t_date) desc,datepart(minute,t_date) desc)
) b
on convert(varchar(8),a.t_date,112) = convert(varchar(8),b.t_date,112)
30 июн 16, 16:59    [19356023]     Ответить | Цитировать Сообщить модератору
 Re: выборка по 1 дню месяца  [new]
_human
Member

Откуда:
Сообщений: 560
declare @values table(num int,t_date datetime,value int)

insert @values(t_date, value)
select '20160601 00:00',10
union
select '20160601 01:00',11
union
select '20160601 02:00',15
union
select '20160601 03:00',16
union
select '20160602 00:00',2
union
select '20160602 01:00',3
union
select '20160602 02:00',6
union
select '20160602 03:00',6
union
select '20160630 00:00',21
union
select '20160630 01:00',33
union
select '20160630 02:00',36
union
select '20160630 05:00',45

;with me as (select DENSE_RANK() over(order by convert(date, t_date)) as dr, *
from @values)

update me
set num = dr

	select 
		 min(num) 	as num
		,min(t_date)as min_t_date
		,min(value) as min_value
		,max(t_date)as max_t_date
		,max(value) as max_value
	into #target
	from @values
	group by convert(date, t_date)

select * from #target

drop table #target
30 июн 16, 17:59    [19356377]     Ответить | Цитировать Сообщить модератору
 Re: выборка по 1 дню месяца  [new]
artgot
Member

Откуда:
Сообщений: 15
Коллеги, спасибо огромное за помощь.

Пока неактуально, но чувствую, что скоро может понадобиться, если в таблицу пишутся показания с 10 устройств, куда добавить WHERE, чтобы собирать нужную мне таблицу только по нескольким устройствам?
30 июн 16, 18:09    [19356427]     Ответить | Цитировать Сообщить модератору
 Re: выборка по 1 дню месяца  [new]
_human
Member

Откуда:
Сообщений: 560
artgot
куда добавить WHERE

top
select
from
group by
having
order by

мммм тут уже как звезды станут
30 июн 16, 18:16    [19356475]     Ответить | Цитировать Сообщить модератору
 Re: выборка по 1 дню месяца  [new]
3unknown
Member

Откуда: New York
Сообщений: 140
declare @values table(device_id int,t_date datetime,value int)

insert @values
select 1,'20160601 00:00',10
union
select 1,'20160601 01:00',11
union
select 1,'20160601 02:00',15
union
select 1,'20160601 03:00',16
union
select 2,'20160601 00:00',8
union
select 2,'20160601 04:00',12
union
select 2,'20160601 05:00',14
union
select 2,'20160601 08:00',18
union
select 1,'20160602 00:00',2
union
select 1,'20160602 01:00',3
union
select 1,'20160602 02:00',6
union
select 1,'20160602 03:00',8
union
select 1,'20160630 00:00',21
union
select 1,'20160630 01:00',33
union
select 1,'20160630 02:00',36
union
select 2,'20160630 00:00',21
union
select 2,'20160630 01:00',33
union
select 2,'20160630 02:00',36
union
select 3,'20160630 05:00',45

select  a.device_id
		,convert(varchar(8),a.t_date,112) as date
		,a.t_date as first_date
		,b.t_date as last_date
		,a.value as first_value
		,b.value as last_value
from(
select top 1 with ties *
from @values
order by row_number() over (partition by device_id, year(t_date),month(t_date),day(t_date) order by datepart(hour,t_date) asc,datepart(minute,t_date) asc)
) a
join(
select top 1 with ties *
from @values
order by row_number() over (partition by device_id, year(t_date),month(t_date),day(t_date) order by datepart(hour,t_date) desc,datepart(minute,t_date) desc)
) b
on a.device_id = b.device_id and convert(varchar(8),a.t_date,112) = convert(varchar(8),b.t_date,112)
where a.device_id in(1,2)
order by a.device_id
30 июн 16, 18:33    [19356555]     Ответить | Цитировать Сообщить модератору
 Re: выборка по 1 дню месяца  [new]
sparrow
Member

Откуда: Россия, Красноярск.
Сообщений: 21759
Вобще в базе удобно иметь таблицы календарей:
Календарь дней,
Календарь месяцев,
Может И годов,

Тогда с датами у матросов, нет вопросов.
30 июн 16, 18:56    [19356634]     Ответить | Цитировать Сообщить модератору
 Re: выборка по 1 дню месяца  [new]
sparrow
Member

Откуда: Россия, Красноярск.
Сообщений: 21759
В календаре месяцев нужна колонка с датой последнего дня, месяца.
В календаре дней строки на каждый день, и колонки с номерами месяца и датами в необходимых форматах.
30 июн 16, 19:03    [19356653]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить