powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Беда с запрососм
16 сообщений из 16, страница 1 из 1
Беда с запрососм
    #32062964
colonel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача:
Есть две таблицы с датами. Нужно сделать соответствие между каждой датой в одной таблице и максимально приближенной к ней с наименьшей стороны в другой.

К сожалению я полный делитант, мой запрос работает, но производительность оного как сами видите просто ужасная. Видимо надо использовать переменные или что-то еще, а я в этом полный профан. Короче горю. Сам запрос:

SELECT DISTINCT MAX(D."DATE"), D1."DATE"
FROM "1.DBF" D, "2.DBF" D1
WHERE
(D1."DATE" >= D."DATE")
GROUP BY D1."DATE"

БУДУ ПРИЗНАТЕЛЕН ЗА ЛЮБОЙ СОВЕТ.
...
Рейтинг: 0 / 0
Беда с запрососм
    #32063010
colonel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Неужели никто не поможет?
...
Рейтинг: 0 / 0
Беда с запрососм
    #32063014
fima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запрос, по моему менять не надо, а вот индексы по полю Date построить надо. И еще мне непонятно название таблицы "1.DBF", Вы в MSSQL работаете?
...
Рейтинг: 0 / 0
Беда с запрососм
    #32063024
vap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запрос можно написать примерно так:

Код: plaintext
1.
2.
SELECT DATE1 = DATE
DATE2 = (SELECT TOP  1  DATE FROM D1 ORDER BY ABS(DATE - D.DATE) DESC
FROM D GROUP BY DATE
...
Рейтинг: 0 / 0
Беда с запрососм
    #32063028
vics
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я думаю Distinct здесь не нужен. Достаточно GROUP BY.
...
Рейтинг: 0 / 0
Беда с запрососм
    #32063080
alterran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У Вас почти правильно все написано. Уберите из запроса DISTINCT (во-первых, это лишнее, а во-вторых, тормозит) и добавьте LEFT OUTER JOIN, если хотите в выборке иметь все даты из исходной таблицы.
Как результат, имеем при следующих условиях:
1). таблица, из которой берутся исходные даты - D;
2). таблица, в которой ищутся даты, максимально
приближенные снизу к соответствующим датам
исходной - D1,
такой запрос
Select D.[date], max(D1.[date])
from D LEFT OUTER JOIN D1 on D.[date] >= D1.[date]
group by D.[date]
...
Рейтинг: 0 / 0
Беда с запрососм
    #32063083
Vasiliy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Vap
Условие ABS(DATE - D.DATE) DESC неправильно, потому что
D1."DATE" >= D."DATE") это не одно и тоже
...
Рейтинг: 0 / 0
Беда с запрососм
    #32063098
vap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Vasiliy почему неправильно ?
Запрос соеденит 2 таблицы по дате с минимальной разницей между соседними датами.

Код: plaintext
1.
2.
SELECT DATE1 = DATE,
DATE2 = (SELECT TOP  1  DATE FROM D1 ORDER BY ABS(DATE - MAX(D.DATE)) DESC
FROM D GROUP BY DATE
...
Рейтинг: 0 / 0
Беда с запрососм
    #32063100
vap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DESC - лишняя.
...
Рейтинг: 0 / 0
Беда с запрососм
    #32063129
Vasiliy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Vap

Условие ABS(DATE1 - DATE2) неравносильно условию
DATE1 >= DATE2

Пример
DATE1 17/10/02

DATE2 15/10/02
18/10/02

При DATE1 >= DATE2 DATE2=15/10/02

При ABS(DATE1 - DATE2) DATE2=18/10/02
т.е.
ABS(DATE1 - DATE2) < 4 <=> (DATE1 - DATE2) < 4 OR (DATE2 - DATE1) < 4
...
Рейтинг: 0 / 0
Беда с запрососм
    #32063137
vap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
См. текст задачи
=Есть две таблицы с датами. Нужно сделать соответствие между каждой датой в одной таблице
=и максимально приближенной к ней с наименьшей стороны в другой.
...
Рейтинг: 0 / 0
Беда с запрососм
    #32063140
LG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DATEDIFF не поможет?
DATEDIFF
Returns the number of date and time boundaries crossed between two specified dates.

Syntax
DATEDIFF ( datepart , startdate , enddate )
...
Рейтинг: 0 / 0
Беда с запрососм
    #32063154
colonel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем, кто отозвался, но задача по-прежнему не решена. Я уже писал, что разбираюсь в SQL только на уровне простейших запросов. Мне кажется что алгоритм решения должен быть следующий:
Пробегая по первой таблице, передаем в параметр значение текущей даты. Далее используя этот параметр находим подзапросом в другой таблице максимальную дату при условии что она меньша параметра и выдаем ее в качестве результата. Короче - это в чистом виде использование ФУНКЦИИ. Вот только как это сделать средствами SQL?
...
Рейтинг: 0 / 0
Беда с запрососм
    #32063165
Vasiliy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Vap
Все правильно модуль то выдасть максимально приближенной к ней с наименьшей стороны и минимально приближенной к ней с наибольшей стороны
...
Рейтинг: 0 / 0
Беда с запрососм
    #32063168
Фотография Nickolay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если задачу я понял правильно, то будет что-нибудь подобное:
Код: plaintext
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.
CREATE Table #T1 ( zone int )
Create TABLE #T2 ( value int )
INSERT #T1 VALUES (  10  )
INSERT #T1 VALUES (  20  )
INSERT #T1 VALUES (  30  )
INSERT #T1 VALUES (  40  )
INSERT #T1 VALUES (  50  )
INSERT #T2 VALUES (  1  )
INSERT #T2 VALUES (  2  )
INSERT #T2 VALUES (  3  )
INSERT #T2 VALUES (  11  )
INSERT #T2 VALUES (  15  )
INSERT #T2 VALUES (  17  )
INSERT #T2 VALUES (  24  )
INSERT #T2 VALUES (  27  )
INSERT #T2 VALUES (  29  )
INSERT #T2 VALUES (  31  )
INSERT #T2 VALUES (  33  )
INSERT #T2 VALUES (  40  )
INSERT #T2 VALUES (  41  )
INSERT #T2 VALUES (  48  )

SELECT zone , Value=( SELECT MAX (value) FROM #T2 WHERE value <= #T1.Zone ) FROM #T1

DROP TABLE #T1
DROP TABLE #T2
...
Рейтинг: 0 / 0
Беда с запрососм
    #32063196
colonel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ОГРОМНОЕ СПАСИБО alterran-у и всем кто ответил. Подсказка про LEFT OUTER JOIN прекрасно работает.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Беда с запрососм
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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