powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как подсчитать точки учета хитрым способом?
8 сообщений из 8, страница 1 из 1
Как подсчитать точки учета хитрым способом?
    #40083726
Здравствуйте!

Есть список идентификаторов точек учета(ТУ). У каждой точки учета за историю существования может быть несколько счетчиков(ПУ) электроэнергии, которые представлены своими идентификаторами. Как построить SELECT, который бы подсчитал количество точек учета следующим способом:
1. Если точки учета за свою историю имеют хотя бы раз один и тот же счетчик, то в общей сумме считать их единожды
2. Если точки учета в своей истории имеют разные счетчики, то учитывать каждую точку.
То есть для этой выборки:
Код: sql
1.
2.
3.
4.
5.
SELECT 1 [ID ТУ], 1 [ID ПУ]
UNION SELECT 1 [ID ТУ], 2 [ID ПУ]
UNION SELECT 2 [ID ТУ], 1 [ID ПУ]
UNION SELECT 2 [ID ТУ], 3 [ID ПУ]
UNION SELECT 3 [ID ТУ], 4 [ID ПУ]


должно получиться 3 точки учета
...
Рейтинг: 0 / 0
Как подсчитать точки учета хитрым способом?
    #40083728
ошибся, должно получиться 2 ТУ
...
Рейтинг: 0 / 0
Как подсчитать точки учета хитрым способом?
    #40083749
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если без хитрых способов?

Есть объекты (О), которые потребляют ЭЭ.

На каждом объекте выделяется одна или несколько ТУ, к которым привязывается потребление этого объекта. Т.е. увидеть ТУ, в отличии от ПУ, нельзя. Самая большая ошибка – это отождествлять ТУ с ПУ.

С каждой ТУ в каждый момент времени может быть сопоставлен один и только один ПУ (установлен на объекте и считает ЭЭ) или не сопоставлено ни одного ПУ. Причин изменения ПУ на О может быть много: выход из строя, снятие на поверку, переход на зимний период, ...

Соответственно потребление ТУ определяется показаниями ПУ или нормами.

Потребление объекта будет равно сумме потребления всех его точек учета.

Пример:

О ТУ ПУ с
1 1 0 2021-01-01 - на ТУ 1 объекта 1 нет прибора
1 1 1 2021-05-01 - на ТУ 1 объекта 1 установлен прибор 1
1 1 2 2021-06-07 - на ТУ 1 объекта 1 установлен прибор 2
1 1 1 2021-06-10 - на ТУ 1 объекта 1 снова установлен прибор 1
1 2 0 2021-01-01 - на ТУ 2 объекта 1 нет прибора
1 2 3 2021-02-01 - на ТУ 2 объекта 1 установлен прибор 3

Таким образом, на объекте 1 в любой момент времени, начиная с 2021-01-01 и до сегодняшнего дня две ТУ и их количество не зависит от использованных ПУ на этом О.
...
Рейтинг: 0 / 0
Как подсчитать точки учета хитрым способом?
    #40083776
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Борис Гаркун
Здравствуйте!

Есть список идентификаторов точек учета(ТУ). У каждой точки учета за историю существования может быть несколько счетчиков(ПУ) электроэнергии, которые представлены своими идентификаторами. Как построить SELECT, который бы подсчитал количество точек учета следующим способом:
1. Если точки учета за свою историю имеют хотя бы раз один и тот же счетчик, то в общей сумме считать их единожды
2. Если точки учета в своей истории имеют разные счетчики, то учитывать каждую точку.
То есть для этой выборки:
Код: sql
1.
2.
3.
4.
5.
SELECT 1 [ID ТУ], 1 [ID ПУ]
UNION SELECT 1 [ID ТУ], 2 [ID ПУ]
UNION SELECT 2 [ID ТУ], 1 [ID ПУ]
UNION SELECT 2 [ID ТУ], 3 [ID ПУ]
UNION SELECT 3 [ID ТУ], 4 [ID ПУ]


должно получиться 3 точки учета


1. Запрос эквивалентности ТУ.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with t as (
			SELECT 1 [ID ТУ], 1 [ID ПУ]
			UNION SELECT 1 [ID ТУ], 2 [ID ПУ]
			UNION SELECT 2 [ID ТУ], 1 [ID ПУ]
			UNION SELECT 2 [ID ТУ], 3 [ID ПУ]
			UNION SELECT 3 [ID ТУ], 4 [ID ПУ]
		)
	, cp as ( select distinct [ID ТУ] from t) -- точки учета
	, cc as ( select cp.[ID ТУ],  [еффID ТУ] = t.[ID ТУ] from cp cross apply( select top(1) t1.* from t inner join t as t1 on t.[ID ПУ] = t1.[ID ПУ] where t.[ID ТУ] = cp.[ID ТУ] order by t1.[ID ТУ] asc ) as t )
	select * from cc


2. Дальше фсе тривиально.
...
Рейтинг: 0 / 0
Как подсчитать точки учета хитрым способом?
    #40083792
Спасибо!
...
Рейтинг: 0 / 0
Как подсчитать точки учета хитрым способом?
    #40083800
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то я слишком все усложнил.
Проще надо

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
with t as (
			SELECT 1 [ID ТУ], 1 [ID ПУ]
			UNION SELECT 1 [ID ТУ], 2 [ID ПУ]
			UNION SELECT 2 [ID ТУ], 1 [ID ПУ]
			UNION SELECT 2 [ID ТУ], 3 [ID ПУ]
			UNION SELECT 3 [ID ТУ], 4 [ID ПУ]
		)
    select t.[ID ТУ],  [еффID ТУ] = min(t1.[ID ТУ]) from t inner join t as t1 on t.[ID ПУ] = t1.[ID ПУ] and t.[ID ТУ] >= t1.[ID ТУ] group by t.[ID ТУ]
...
Рейтинг: 0 / 0
Как подсчитать точки учета хитрым способом?
    #40083815
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Непреодолимая тяга ко всему хитрому!

Спаси вас бог от хитрых платежек энергопоставляющих компаний!
...
Рейтинг: 0 / 0
Как подсчитать точки учета хитрым способом?
    #40083841
Спасибо! Постараюсь исполнить ваши наставления :)
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как подсчитать точки учета хитрым способом?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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