powered by simpleCommunicator - 2.0.39     © 2025 Programmizd 02
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Выборка дат с использованием ADO
21 сообщений из 21, страница 1 из 1
Выборка дат с использованием ADO
    #38873725
Eugene_p1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую, коллеги!

Давно не писал ничего, но тут появилась бизнес-задача, уперся в проблему. Пригодится подсказка!

Ситуация: есть xlsx, содержащий массив дат с компаниями и ценами, даты могут повторяться.
Я подключаюсь к нему через ADO и забираю даты:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Dim cnn As ADODB.Connection
Dim RS As ADODB.Recordset
Dim sSQL$, sPath$, iCnt&


    sPath = "C:\file.xlsx"
    
    Set cnn = New ADODB.Connection
    cnn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=""" & sPath & """;Extended Properties=""Excel 12.0;HDR=YES"";"
    cnn.Open
    sSQL$ = "SELECT Дата FROM [Customs$E1:E45000] ORDER BY Дата"
    
    Set RS = New ADODB.Recordset
    Set RS.ActiveConnection = cnn
    RS.Open sSQL$, cnn, adOpenStatic, adLockReadOnly



Теперь мне нужно в получившемся отсортированном массиве данных взять каждые 7 последовательных дат, и произвести вычисления над всеми записями в каждом таком диапазоне дат.

Поскольку Row_Number() тут не работает, подскажите пожалуйста какой-нибудь алгоритм, а то уже совсем уткнулся.
Получаю в рекордсет:
Дата01.01.201302.01.201303.01.201304.01.201305.01.201306.01.201307.01.201308.01.201309.01.201310.01.201311.01.201312.01.201313.01.201314.01.201315.01.201316.01.201317.01.201318.01.201319.01.201320.01.201321.01.2013
Нужно
Дата СДата По Вычисленный столбец01.01.2013 07.01.20131234.4408.01.201314.01.2013543.115.01.201321.01.2013432.14

Можно как-то джойнить рекордсет к запросу? ;)

Спасибо!
...
Рейтинг: 0 / 0
Выборка дат с использованием ADO
    #38873732
maximjon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene_p1Приветствую, коллеги!

Давно не писал ничего, но тут появилась бизнес-задача, уперся в проблему. Пригодится подсказка!

Ситуация: есть xlsx, содержащий массив дат с компаниями и ценами, даты могут повторяться.
Я подключаюсь к нему через ADO и забираю даты:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Dim cnn As ADODB.Connection
Dim RS As ADODB.Recordset
Dim sSQL$, sPath$, iCnt&


    sPath = "C:\file.xlsx"
    
    Set cnn = New ADODB.Connection
    cnn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=""" & sPath & """;Extended Properties=""Excel 12.0;HDR=YES"";"
    cnn.Open
    sSQL$ = "SELECT Дата FROM [Customs$E1:E45000] ORDER BY Дата"
    
    Set RS = New ADODB.Recordset
    Set RS.ActiveConnection = cnn
    RS.Open sSQL$, cnn, adOpenStatic, adLockReadOnly




Теперь мне нужно в получившемся отсортированном массиве данных взять каждые 7 последовательных дат, и произвести вычисления над всеми записями в каждом таком диапазоне дат.

Поскольку Row_Number() тут не работает, подскажите пожалуйста какой-нибудь алгоритм, а то уже совсем уткнулся.
Получаю в рекордсет:
Дата01.01.201302.01.201303.01.201304.01.201305.01.201306.01.201307.01.201308.01.201309.01.201310.01.201311.01.201312.01.201313.01.201314.01.201315.01.201316.01.201317.01.201318.01.201319.01.201320.01.201321.01.2013
Нужно
Дата СДата По Вычисленный столбец01.01.2013 07.01.20131234.4408.01.201314.01.2013543.115.01.201321.01.2013432.14

Можно как-то джойнить рекордсет к запросу? ;)

Спасибо!

Select в Select ни как?

Код: sql
1.
2.
Select *
From (SELECT Дата FROM [Customs$E1:E45000] ORDER BY Дата)
...
Рейтинг: 0 / 0
Выборка дат с использованием ADO
    #38873744
datepart ww
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторвзять каждые 7 последовательных дат
"7 последовательных дат" - это не неделя слуйно ?
если да, то посчитать можно в запросе с группировкой по номеру недели, типа такого
Код: sql
1.
2.
3.
SELECT Avg(Цена) AS [AvgЦена], datepart("ww", Дата, 2)
FROM T
GROUP BY datepart("ww", Дата, 2)
...
Рейтинг: 0 / 0
Выборка дат с использованием ADO
    #38874560
Eugene_p1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, спасибо за комментарии.
Нет, 7 дней - это произвольный интервал, и он будет меняться.

SELECT на SELECT - это очевидно, разумеется, так и будет. Только что написать во внешнем SELECT'е? ROW_NUMBER() не поддерживается. Как мне пронумеровать даты (сложность в этом)? Это не календарь - нескольких дат может не быть. Нумеруются именно присутствующие в выборке.
...
Рейтинг: 0 / 0
Выборка дат с использованием ADO
    #38874566
Eugene_p1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А можно ли присоединить к запросу recordset?

Код: sql
1.
2.
SELECT Value FROM Customs$E1:E45000 a JOIN 
SELECT Дата FROM Recordset ON ... = ...


?
...
Рейтинг: 0 / 0
Выборка дат с использованием ADO
    #38874691
guest123456
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А select top 7 чем не устраивает?
Выбрали первые семь дат, запомнили последнюю, выбрали первые семь после запомненной и т.д.
...
Рейтинг: 0 / 0
Выборка дат с использованием ADO
    #38874708
datepart ww
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Eugene_p1Нет, 7 дней - это произвольный интервал, и он будет меняться.

""произвольный интервал" - в смысле, он не обязательно с понедельника ?
"в интервале всегда 7мь дней ? если "да":

у функции datepart, 3ий параметр определяет с какого дня недели начинается неделя,
вот 2ка тут - это понедельник - datepart("ww", Дата, 2)

вот, если, например, первый интервал начинается с мин.даты в диапазоне, то определяете эту мин дату, - определяете какой это день недели, - и динамически строите запрос, с параметром в datepart соотв.этому дню недели
...
Рейтинг: 0 / 0
Выборка дат с использованием ADO
    #38874804
гр к
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Eugene_p1Теперь мне нужно в получившемся отсортированном массиве данных взять каждые 7 последовательных дат, и произвести вычисления над всеми записями в каждом таком диапазоне дат.

А вар-т сделать в экселе производную таблицу с атрибутом номера х-дневного интервала и потом уже с этой таблицей все дела делать не подойдет? Тупо столбик добавить для 01.01.2013 - 07.01.2013 rank= 1, 01.08.2013 - 14.01.2013 rank= 2 и тд?
...
Рейтинг: 0 / 0
Выборка дат с использованием ADO
    #38874921
Eugene_p1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
гр кА вар-т сделать в экселе производную таблицу с атрибутом номера х-дневного интервала и потом уже с этой таблицей все дела делать не подойдет? Тупо столбик добавить для 01.01.2013 - 07.01.2013 rank= 1, 01.08.2013 - 14.01.2013 rank= 2 и тд?
К сожалению, так и пришлось сделать. И к сожалению, теперь нужно делать перебор интервалов и выполнение подзапроса по каждому из них. Ожидаю, что будет медленно, но пока другого решения не нашел.

Засада еще одна - в подзапросе нужно брать i-й элемент, скажем i = CInt(Count(*)*1/4), i = CInt(Count(*)*3/4).
Вот что с этим делать - вообще ума не приложу. Пока что.
...
Рейтинг: 0 / 0
Выборка дат с использованием ADO
    #38874922
Eugene_p1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
datepart wwу функции datepart, 3ий параметр определяет с какого дня недели начинается неделя,
вот 2ка тут - это понедельник - datepart("ww", Дата, 2)

Этот алгоритм не подходит, т.к. интервал может быть 3, 5, 4, 10, и т.д., а даты идут произвольным массивом, т.е. могут быть не подряд.
...
Рейтинг: 0 / 0
Выборка дат с использованием ADO
    #38875177
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Eugene_p1,
днные для вычислений можешь получить в одном запросе с датами ?
...
Рейтинг: 0 / 0
Выборка дат с использованием ADO
    #38875744
Eugene_p1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
скукотищаEugene_p1,
днные для вычислений можешь получить в одном запросе с датами ?
Да.
Но даты я получаю с DISTINCT, т.к. в одну дату может быть несколько строк с данными.
...
Рейтинг: 0 / 0
Выборка дат с использованием ADO
    #38876066
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Eugene_p1,
> Но даты я получаю с DISTINCT, т.к. ...

Можно выбирать записи полностью, а не только даты.
Код: vbnet
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.
' ...
sSQL$ = "SELECT Дата, {остальные поля, необходимые для вычислений} FROM [Customs$????] ORDER BY Дата"
' ...
RS.Open sSQL$, cnn, adOpenStatic, adLockReadOnly

Dim dateCounter As Integer, currentDate As Date, startDate As Date
Const DATE_GROUP As Integer = 7

if RS.BOF then
  ' RS has no records

else
  RS.MoveFirst
  ' ... очистить "аккумулятор промежуточных данных"
  currentDate = RS("Дата").Value: startDate = currentDate: dateCounter = 1

  do until RS.EOF    
    If currentDate <> RS("Дата").Value Then
        dateCounter = dateCounter + 1
        If dateCounter > DATE_GROUP Then
            ' ... вычислить/вернуть результат для группы дат

            ' ... очистить "аккумулятор промежуточных данных"
            startDate = RS("Дата").Value: dateCounter = 1
        End If
        currentDate = RS("Дата").Value
    End If

    ' ... аккумулировать данные для вычислений, либо, если возможно, вычислять промежуточные значения
    RS.MoveNext
  loop

  ' ... вычислить/вернуть результат для последней группы дат 
end if
' ...

...
Рейтинг: 0 / 0
Выборка дат с использованием ADO
    #38876912
Eugene_p1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
скукотища,

Хммм. Спасибо за наводку! Буду иметь в виду, тк работать еще и работать.

В текущем виде реализовал так:
Сгруппированные даты отдельным запросом.
Данные анализируются накладыванием фильтра на дату, и прохождением по отфильтрованным строкам для каждой даты.
...
Рейтинг: 0 / 0
Выборка дат с использованием ADO
    #38881046
Eugene_p1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Усложнили задачу.

Год нужно разбить на интервалы в Х дней (значение меняется), и собирать записи между ними.

Что посоветуете?

Первый интервал получить просто:
Код: sql
1.
SELECT '2013-01-01' as DateStart, DATEADD('d', 15, '2013-01-01') as DateEnd 



Как размножить интервалы?
...
Рейтинг: 0 / 0
Выборка дат с использованием ADO
    #38881056
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наводка
Код: sql
1.
2.
3.
4.
SELECT Min(Date), Max(Date)
FROM FN_DailyValues
GROUP BY YEAR(Date), FLOOR(DATEPART(dayofyear, Date)/15)
ORDER BY Min(Date)

(в сам топик не вчитывался, сорри, если не по теме)
...
Рейтинг: 0 / 0
Выборка дат с использованием ADO
    #38881064
Eugene_p1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уточню вопрос.

Как написать это:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
declare @i as integer
set @i = 7 
--по факту @i будет задаваться как параметр

;with a as
(
SELECT cast('20130101' as datetime) as DateStart, DATEADD(day, @i, cast('20130101' as datetime)) as DateEnd
UNION ALL
SELECT DATEADD(day,@i, a.DateStart), DATEADD(day, @i, a.DateEnd) 
from a WHERE a.DateStart <= cast('20131231' as datetime)
) 
SELECT Datestart, DateEnd FROM a WHERE a.DateStart <= cast('20131231' as datetime)


на понятном для Access SQL языке? :)
...
Рейтинг: 0 / 0
Выборка дат с использованием ADO
    #38881073
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proнаводкапоправочка (а то первый интервал неверный получается)
Код: sql
1.
2.
3.
4.
SELECT Min(Date), Max(Date)
FROM FN_DailyValues
GROUP BY YEAR(Date), FLOOR((DATEPART(dayofyear, Date)-1)/15)
ORDER BY Min(Date)
...
Рейтинг: 0 / 0
Выборка дат с использованием ADO
    #38881161
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Eugene_p1,
> Уточню вопрос.
> Как написать это:
> {многабукав}

чтобы потом опять соединять полученный набор записей с таблицей данных ?


Предложение 17245217 остаётся в силе.
...
Рейтинг: 0 / 0
Выборка дат с использованием ADO
    #38881579
Eugene_p1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
скукотища,

Чёрт возьми! Есть тут рациональное зерно! :)

Спасибо, я подумаю ещё раз, получше! :)

(на самом деле, эххх, если бы задачи ставились сразу и чётко...)
...
Рейтинг: 0 / 0
Выборка дат с использованием ADO
    #38882182
Eugene_p1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
скукотища,

Спасибо большое!
Так и реализовал, оказалось даже быстрее.
Наглядный пример, что в случае с Excel не нужно упираться в SQL. :)
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Выборка дат с использованием ADO
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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