powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос по выборке
13 сообщений из 38, страница 2 из 2
Вопрос по выборке
    #38343557
rukesa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый Mnior,
может быть Ваш способ и лучше, но, к сожалению, мне пока не хватает знаний понять синтаксис запроса, квадратные скобки ставят меня в тупик) спасибо
...
Рейтинг: 0 / 0
Вопрос по выборке
    #38343566
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rukesaУважаемый Mnior,
может быть Ваш способ и лучше, но, к сожалению, мне пока не хватает знаний понять синтаксис запроса, квадратные скобки ставят меня в тупик) спасибоYEAR, FROM, TO - это, вообще-то, ключевые слова TSQL.
То, что они как-то обрабатываются в качестве имён полей таблицы сервером, - бонус с его стороны,
на который нельзя всегда полагаться.
Если имена объектов содержат недопустимые символы или ключевые слова,
их надо заключить в двойные кавычки (если SET QUOTED_IDENTIFIER ON)
или в квадратные скобки (они работают всегда)
...
Рейтинг: 0 / 0
Вопрос по выборке
    #38343854
fwqefwqfrg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
with tres as
(
	select *
	from (
			values
			(2011,'123'),
			(2012,'123'),
			(2013,'123')
		) as d(yr, tid)
),
ill as
(
	select *
	from
	(
		values
		(cast('20111204' as datetime), cast('20120301' as datetime), '123'),
		(cast('20110901' as datetime), cast('20130201' as datetime), '123'),
		(cast('20121101' as datetime), cast('20121201' as datetime), '123')
	) d(db, de, tid)
),
step1 as
(
	select
		t1.tid,
		case when n = 1 then t1.db else t1.de end as dt,
		case when n = 1 then +1 else -1 end as b_e_flag
	from
		ill t1
			cross join 
		(
		 select 1
			union all
		 select 2
		) as t2(n)
),
step2 as
(
	-- учитываем, что промежутки в ill могут пересекаться, если не могут, то можно проще
	select tid, dt, b_e_flag
	from
	(
		select *, sum(b_e_flag) over(partition by tid order by dt) a_cnt
		from step1
	) t1
	where (a_cnt = 0 and b_e_flag = -1) or (a_cnt = 1 and b_e_flag = 1)

	union all

	select
		t1.tid,
		case when n = 1 then datefromparts(t1.yr, 01, 01) else datefromparts(t1.yr, 12, 31) end as dt,
		case when n = 1 then +1 else -1 end as b_e_flag
	from
		tres t1
			cross join 
		(
		 select 1
			union all
		 select 2
		) as t2(n)

)
select tid, year(min(dt)) as yr, min(dt) as bd, max(dt) as ed, datediff(d, min(dt), max(dt)) as cnt
from
(
	select tid, dt, (row_number() over(partition by tid order by dt) - 1) / 2 as g
	from
	(
		select *, sum(b_e_flag) over(partition by tid order by dt) as a_cnt
		from step2
	) t1
	where (a_cnt = 2 and b_e_flag = 1) or (a_cnt = 1 and b_e_flag = -1)
) t2
group by tid, g
order by tid, bd
...
Рейтинг: 0 / 0
Вопрос по выборке
    #38344026
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shakillа зачем усложнять задачу?Где?
Наоборот, упрощаю. Есть одна модель понимания - и все "формулы" становятся одинаковыми во всех 100500 разнообразных задачах и главное простыми. И читаются мгновенно.

А так, "А тут у нас нет у даты времени, так давайте сделаем всё по другому и вымучаем формулы"
Как в анекдоте:
- В командирских часах 8 стрелок.
- Зачем?
- 4-ре для дезориентации противника!
Shakillесли в опорной таблице ...., то для проверки ...
... и это самый простой вариантГде он проще? Посмотрите на мой запрос - он что сложнее?
Ваш сложнее, ибо надо всё понять через призму множества всяких "если-то".

Shakillно это общий подход и код бы получился несколько сложнееГде?
Вы мне ответьте где сложнее? Конкретно.

rukesaдействительно, время в данной таблице всегда 00:00:00.000Зачем вам об этом думать, есть там оно или нет?
Завтра придёт заказчик и скажет "А давайте будет"
И всё, ваш код уже не работает. Смысл.

Вы не путайте объективное "проще", от вашего субъективного. Не умеет кого-то пользоваться молотком, не значит что надо всегда бить гвозди микроскопом.
Ага, педалью "газ" умею пользоваться, а вот "тормоз" не понимаю?! Надо знать то чем пользуетесь, т.е. базовые основы скуля и MSSQL.

авторможет быть Ваш способ и лучше, но, к сожалению, мне пока не хватает знаний понять синтаксис запроса, квадратные скобки ставят меня в тупик)Да неужели вы решили задать вопрос?! Как-то нестандартно для гуманитария. Обычно у них "непонятное - игнорируй". А также, "не важен результат, и на сколько он хорош/правилен, главное что галочка есть и 'мне нравиться'".
Надеюсь что уже стало понятно. Но вопросы можно задавать. Разрешаю.
"ставят меня в тупик" - у не нормальных людей обычно "появляются вопросы, которые так приятно познать", притом познать в первую очередь самому, чтобы эту познавалку развить, чтобы догадываться до всего на свете самому.

fwqefwqfrg , BrainFuck ?
...
Рейтинг: 0 / 0
Вопрос по выборке
    #38344126
fwqefwqfrg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mnior, хотелось выписаться (от слова писАть) :D
...
Рейтинг: 0 / 0
Вопрос по выборке
    #38344139
efqwefqwe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mnior,

на самом деле хотелось сделать, чтобы каждая таблица были считаны по одному разу. Но вылезла куча сортировок и не каким индексом не поправить это так как последовательность дат из разных таблиц. Вобщем выложил что есть для Brain Fuck'a...
...
Рейтинг: 0 / 0
Вопрос по выборке
    #38344212
fwqefwqfrg
Код: sql
1.
	-- учитываем, что промежутки в ill могут пересекаться, если не могут, то можно проще



Как вариант объединения пересекающихся и входящих друг в друга интервалов
...
Рейтинг: 0 / 0
Вопрос по выборке
    #38344451
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
efqwefqweхотелось сделать, чтобы каждая таблица были считаны по одному разуБоже.
А не было задачи написать запрос чтобы букв A было чётным?!

Единственный смысл таблицы годов как раз и считываться много раз - делить отрезки на куски.
Изначальный смысл вещей ничто не должно затмевать, тем более всякие симулякры.
...
Рейтинг: 0 / 0
Вопрос по выборке
    #38344459
jfjfjkgkgkdkd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эхfwqefwqfrg
Код: sql
1.
	-- учитываем, что промежутки в ill могут пересекаться, если не могут, то можно проще



Как вариант объединения пересекающихся и входящих друг в друга интервалов

Спасибо за такой вариант. Хорошо, можно не преобразуя таблицу сразу все считать. И за сайт тоже, не знал про него.
...
Рейтинг: 0 / 0
Вопрос по выборке
    #38344468
wefqwefq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mnior, согласен

MniorЕдинственный смысл таблицы годов как раз и считываться много раз - делить отрезки на куски.


Хм. А может обращаться к таблице каникул N раз, где N - количество годов в таблице годов?
...
Рейтинг: 0 / 0
Вопрос по выборке
    #38344594
=)8)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
OFFTOP лучше 10 раз по разу, чем ни разу 10 раз
...
Рейтинг: 0 / 0
Вопрос по выборке
    #38345194
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
оффтоп 2 MniorMniorShakillно это общий подход и код бы получился несколько сложнее
Где?
Вы мне ответьте где сложнее? Конкретно.

моя подсказка была для исходных данных из 14609975 этого сообщения. то есть автору оставалось дописать только select к тому что он уже сделал. принципиальных отличий нет, и я думаю ТС способен понять на примерах нюансы типа того, когда надо включать границы интервалов, а когда - наоборот.

но непонятно, зачем по такой мелочи вы пишете столько много букв.
...
Рейтинг: 0 / 0
Вопрос по выборке
    #38346070
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wefqwefqХм. А может обращаться к таблице каникул N раз, где N - количество годов в таблице годов?Вы хотите решить статистическую задачу?

Перед этим надо проверить осмысленность задачи. И практически задача ТС не имеет смысла. Обычно собирается данные за один год, для подсчёта.

Во вторых, надо понимать первую проблему диапазонов в скуле: Модель с двумя полями (From,To) нормально не оптимизируется, ибо индексы линейны, см подробности ( 12610105 ).
Т.е. поиск, аля: From >= X AND To < Y - вываливается в полу-скан.
В моём случае диапазон указывается по одному полю: From >= Y AND From < Y что сильно ограничивает скан (в основном до одного значения).

В третьих Статистически количество годов намного больше, чем пересечений года в диапазонах. Отпуска более года вообще редкость. Соответственно полу-сканы ещё менее покрываемы

Поэтому, предлагаемый вами "обратный вариант" будет обрабатывать заметно больше строк.

В четвёртых, эти данные собираются для конкретной цели, для которых порядок данных может быть существенный. В вашем случае жёсткий порядок сбора и объединение смешивает карты и может добавить дополнительные большие ресурсы сортировки.
В моём случае порядок данных отпусков неважен, не определяется и не навязывается.

В пятых, я говорил про множественное считывание, о его неизбежности, ибо эта задача о генерации данных, а не к примеру "слиянии". И тут уже не важно, повторно считывается Года или Отпуска - те же яйца, только в профиль.

В шестых, запрос должен быть декларативным, и сервер должен сам выбирать порядок соединения. Но к сожалению не всякое выражение декларативно для сервера, но если появятся соответствующие оптимизации (что вероятно, т.к. функция детерминирована и линейна), то можно сказать что я не задаю порядок соединения. К тому же его можно поменять простой перестановкой.
эквивалентное выражение
Код: sql
1.
2.
3.
Y.[From] >= DateAdd(Year,-1,H.[From])
-- =>
DateAdd(Year,1,Y.[From]) >= H.[From]

...
Рейтинг: 0 / 0
13 сообщений из 38, страница 2 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос по выборке
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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