powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / добавить условие в сложный join
8 сообщений из 33, страница 2 из 2
добавить условие в сложный join
    #40014656
artgot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222
artgot

Но так возвращает пустой запрос.


1. У тя даты "с секундами" в таблице?

Код: sql
1.
2.
3.
4.
5.
6.
7.
declare @dts table(dt date primary key);
insert @dts values('20170214'),('20170226'),('20170228');

with m as ( select * from [meter] )
   , d as ( select id, foreign_id = isnull(foreign_id, id), fdate = min([datetime]), ldate = max([datetime]) from m 
where exists( select * from @dts as x where m.[datetime] between x.dt and dateadd(day, 1, x.dt ) ) group by id, foreign_id 
)0



2. Даты то есть ли?


1. Да. Пример 2017-02-14 18:59:07.000
2. Есть даты.
...
Рейтинг: 0 / 0
добавить условие в сложный join
    #40014657
artgot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222
Это ж фсе тупо и незатейливо проверяется


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
declare @dts table(dt date primary key);
insert @dts values('20170214'),('20170226'),('20170228');

with m as ( select * from [meter] as m where exists( select * from @dts as x where m.[datetime] between x.dt and dateadd(day, 1, x.dt ) ) )
  select * from m;
-- должон быть результат

with m as ( select * from [meter] as m where exists( select * from @dts as x where m.[datetime] between x.dt and dateadd(day, 1, x.dt ) ))
   , d as ( select id, foreign_id = isnull(foreign_id, id), fdate = min([datetime]), ldate = max([datetime]) from m group by id, foreign_id  )
  select * from d;
-- тогда и тут будет результат

-- запросы, по первости, следует писать "понемногу" мелкими прыжками в сторону результата.



Я стараюсь так и делать, но плохо получается, конструкцию with вообще не могу до конца понять с рекурсией.

Если пользователь делает выборку нескольких дней, например, 14, 26, 28, то мне надо за каждый день выбрать начальное значение в этот день и время когда это было зафиксировано, конечное значение в этот день и время когда это было зафиксировано и так за каждый выбранный день и за каждый выбранный счетчик.
...
Рейтинг: 0 / 0
добавить условие в сложный join
    #40014678
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Одному мне кажется, что вся структура какая-то то ли кривая, то ли непонятная?
И что должно быть как-то так:

...
Рейтинг: 0 / 0
добавить условие в сложный join
    #40014690
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artgot
Я стараюсь так и делать, но плохо получается, конструкцию with вообще не могу до конца понять с рекурсией.


1. У тебя рекурсии нет.
2. with t as (select ... from dbo.MyBigTableNameTraLaLa) - это просто объявление псевдонима. Чтобы длинных имен таблицы не писать.
3. Ну и удобное место для применения фильтров where.
...
Рейтинг: 0 / 0
добавить условие в сложный join
    #40014691
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artgot
Если пользователь делает выборку нескольких дней, например, 14, 26, 28, то мне надо за каждый день выбрать начальное значение в этот день и время когда это было зафиксировано, конечное значение в этот день и время когда это было зафиксировано и так за каждый выбранный день и за каждый выбранный счетчик.


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
declare @dts table(dt date primary key);
insert @dts values('20170214'),('20170226'),('20170228');

-- за каждый день
with m as ( select * from [meter] as m where exists( select * from @dts as x where m.[datetime] between x.dt and dateadd(day, 1, x.dt ) ))
   , d as ( select id, foreign_id = isnull(foreign_id, id), fdate = min([datetime]), ldate = max([datetime]) 
                     , [date] = cast([datetime] as date),
                from m 
               group by id, foreign_id, cast([datetime] as date)
            )
  select * from d;
...
Рейтинг: 0 / 0
добавить условие в сложный join
    #40014766
artgot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat
Одному мне кажется, что вся структура какая-то то ли кривая, то ли непонятная?
И что должно быть как-то так:



id descr foreign_id20 счетчик 1 21 счетчик 2 2424 счетчик 3
id DateTime pow20 2017-02-14 18:59:07.000 23305.221 2017-02-14 18:59:07.000 31051.924 2017-02-14 18:59:07.000 60832.3

Вот такая структура, есть таблица с данными со счетчиков в определенное время и есть таблица с описанием счетчиков и зависимостей.
...
Рейтинг: 0 / 0
добавить условие в сложный join
    #40014771
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artgot
Вот такая структура, есть таблица с данными со счетчиков в определенное время и есть таблица с описанием счетчиков и зависимостей.

Ну так надо в таблице показаний поле id по-человечески переименовать. "Id" это традиционно первичный ключ, а у тебя первичный ключ, очевидно, это составной (id, DateTime).
...
Рейтинг: 0 / 0
добавить условие в сложный join
    #40014785
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artgot,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
-- первое и последнее время снятия показания по дням
;WITH first_last_times AS (
SELECT id, DATEADD(Day, DATEDIFF(Day, 0, DateTime), 0) day,
  MIN(DateTime) OVER(PARTITION BY id, DATEADD(Day, DATEDIFF(Day, 0, DateTime), 0)) first_time,
  MAX(DateTime) OVER(PARTITION BY id, DATEADD(Day, DATEDIFF(Day, 0, DateTime), 0)) last_time
  FROM registrations
),
-- первое и последнее показание по дням
first_last_pow AS (
SELECT flt.id, flt.day, r1.pow first_pow, r2.pow last_pow
  FROM first_last_times flt 
     JOIN registrations r1 ON flt.id = r1.id AND flt.first_time = r1.DateTime
     JOIN registrations r2 ON flt.id = r2.id AND flt.last_time = r1.DateTime
)
-- соединяем показания с таблицей счетчиков
SELECT m.id, m.descr, flp.day, flp.first_pow, flp.last_pow
FROM meters m JOIN first_last_pow flp
  ON
     -- если в foreign_id ничего нет, то соединяем по id
     (m.foreign_id IS NULL AND m.id = flp.id) OR
     -- а если foreign_id есть, то соединяем по foreign_id
     (m.foreign_id IS NOT NULL AND m.foreign_id = flp.id)
...
Рейтинг: 0 / 0
8 сообщений из 33, страница 2 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / добавить условие в сложный join
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]