Гость
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Выборка дат с использованием ADO / 21 сообщений из 21, страница 1 из 1
06.02.2015, 20:53
    #38873725
Eugene_p1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка дат с использованием ADO
Приветствую, коллеги!

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

Ситуация: есть 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
06.02.2015, 21:08
    #38873732
maximjon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка дат с использованием ADO
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
06.02.2015, 21:55
    #38873744
datepart ww
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка дат с использованием ADO
авторвзять каждые 7 последовательных дат
"7 последовательных дат" - это не неделя слуйно ?
если да, то посчитать можно в запросе с группировкой по номеру недели, типа такого
Код: sql
1.
2.
3.
SELECT Avg(Цена) AS [AvgЦена], datepart("ww", Дата, 2)
FROM T
GROUP BY datepart("ww", Дата, 2)
...
Рейтинг: 0 / 0
09.02.2015, 11:15
    #38874560
Eugene_p1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка дат с использованием ADO
Коллеги, спасибо за комментарии.
Нет, 7 дней - это произвольный интервал, и он будет меняться.

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

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


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

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

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

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

А вар-т сделать в экселе производную таблицу с атрибутом номера х-дневного интервала и потом уже с этой таблицей все дела делать не подойдет? Тупо столбик добавить для 01.01.2013 - 07.01.2013 rank= 1, 01.08.2013 - 14.01.2013 rank= 2 и тд?
...
Рейтинг: 0 / 0
09.02.2015, 15:46
    #38874921
Eugene_p1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка дат с использованием ADO
гр кА вар-т сделать в экселе производную таблицу с атрибутом номера х-дневного интервала и потом уже с этой таблицей все дела делать не подойдет? Тупо столбик добавить для 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
09.02.2015, 15:48
    #38874922
Eugene_p1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка дат с использованием ADO
datepart wwу функции datepart, 3ий параметр определяет с какого дня недели начинается неделя,
вот 2ка тут - это понедельник - datepart("ww", Дата, 2)

Этот алгоритм не подходит, т.к. интервал может быть 3, 5, 4, 10, и т.д., а даты идут произвольным массивом, т.е. могут быть не подряд.
...
Рейтинг: 0 / 0
09.02.2015, 20:46
    #38875177
скукотища
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка дат с использованием ADO
Eugene_p1,
днные для вычислений можешь получить в одном запросе с датами ?
...
Рейтинг: 0 / 0
10.02.2015, 12:22
    #38875744
Eugene_p1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка дат с использованием ADO
скукотищаEugene_p1,
днные для вычислений можешь получить в одном запросе с датами ?
Да.
Но даты я получаю с DISTINCT, т.к. в одну дату может быть несколько строк с данными.
...
Рейтинг: 0 / 0
10.02.2015, 16:00
    #38876066
скукотища
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка дат с использованием ADO
> 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
11.02.2015, 13:10
    #38876912
Eugene_p1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка дат с использованием ADO
скукотища,

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

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

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

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

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



Как размножить интервалы?
...
Рейтинг: 0 / 0
16.02.2015, 18:28
    #38881056
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка дат с использованием ADO
наводка
Код: 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
16.02.2015, 18:32
    #38881064
Eugene_p1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка дат с использованием ADO
Уточню вопрос.

Как написать это:
Код: 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
16.02.2015, 18:45
    #38881073
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка дат с использованием ADO
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
16.02.2015, 21:18
    #38881161
скукотища
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка дат с использованием ADO
> Eugene_p1,
> Уточню вопрос.
> Как написать это:
> {многабукав}

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


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

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

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

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

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


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