Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запрос к табличке с группировкой / 10 сообщений из 10, страница 1 из 1
27.01.2009, 21:14
    #35781180
dronnik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к табличке с группировкой
Имеется табличка

IDDPIDDSSTRDDATE11q12009-01-0721q22009-01-0831q32009-01-0442q42009-02-2752q52009-01-2762q62009-01-0173q72009-01-1583q82009-01-1793q92009-01-22104q102009-01-27

необходимо получить сгруппированные записи по полю PIDD.
Для каждой записи получить соответствующее значение поля SSTR.
Значения поля SSTR должны отбираться из групп записей и соответствовать максимальной дате из группы.

В итоге мы должны получить табличку

PIDDSST1q22q43q94q10

В Oracle это можно получить выполнив запрос

Код: plaintext
1.
2.
3.
4.
5.
SELECT 
UNIQUE 
  t.pidd,
  FIRST_VALUE (t.sstr) OVER (PARTITION BY t.pidd ORDER BY t.ddate DESC) as sst
FROM atd t
ORDER BY t.pidd

Меня интересует как это можно осуществить через провайдер фокса
Microsoft OLE DB Provider for VFP 9.0 SP2 ?
...
Рейтинг: 0 / 0
28.01.2009, 05:25
    #35781526
Galyamov Rinat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к табличке с группировкой
Как то вот так.

Уверен, что в оракле такой синтаксис тоже поддерживается.

select pidd, max(sstr) from atd t group by pidd where t.ddate in (select
max(ddate) from atd d where d.pidd=t.pidd)


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
28.01.2009, 09:38
    #35781720
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к табличке с группировкой
...
Рейтинг: 0 / 0
28.01.2009, 12:17
    #35782274
kiruha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к табличке с группировкой
PaulWist Выбрать из дочерней таблицы записи с максимальной датой

Давно видел эту статью и всегда было непонятно - в случае ограничения
на родительские записи - запрос в сатье будет лопатить всю дочернюю таблицу.
Уж лучше коррелированный подзапрос(если есть связь по индексу), тем более пишут что оптимизатор не выполняет его N раз.
...
Рейтинг: 0 / 0
28.01.2009, 17:57
    #35783702
dronnik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к табличке с группировкой
Интересное решение в запросе
Код: plaintext
1.
select pidd, max(sstr) from atd t group by pidd where t.ddate in (select 
max(ddate) from atd d where d.pidd=t.pidd)
И действительно оно работает. Уловка max(sstr) работает, но всегда ли правильно это будет работать. Сам бы я наверное не допер. Спасибо за ответы!
...
Рейтинг: 0 / 0
29.01.2009, 06:09
    #35784320
Galyamov Rinat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к табличке с группировкой
Работать будет всегда с одинаковым (ожидаемым) результатом в том случае,
если пара pidd и max(ddate) - дает уникальный результат (т.е. в таблице есть
только одна строка с такими значениями) для всех сочетаний pidd и
max(ddate).


Например, если max(date) и pidd не дают уникального результата:

ppid date sstr
1 01.01.2009 1
1 01.01.2009 2
1 01.01.2009 3

sstr будет равен 3, хотя для данного сочетания ppid и date есть еще и 1,2


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
29.01.2009, 10:27
    #35784649
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к табличке с группировкой
kiruhaPaulWist Выбрать из дочерней таблицы записи с максимальной датой

Давно видел эту статью и всегда было непонятно - в случае ограничения
на родительские записи - запрос в сатье будет лопатить всю дочернюю таблицу.
Уж лучше коррелированный подзапрос(если есть связь по индексу), тем более пишут что оптимизатор не выполняет его N раз.

Вот пример

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SET  DELETED OFF 
CREATE CURSOR Master (f1 int)
SELECT Master 
INDEX on f1 TAG f1

CREATE CURSOR Details (Master_f1 int, f1 int)
SELECT details
INDEX on Master_f1 TAG Master_f1

INSERT INTO Master VALUES ( 1 )
INSERT INTO Master VALUES ( 2 )

INSERT INTO Details VALUES ( 1 ,  1 )
INSERT INTO Details VALUES ( 1 ,  1 )

SYS( 3054 , 11 )
SELECT * FROM Master M;
LEFT JOIN Details D ON D.Master_f1 = M.f1;
where M.f1 =  1  INTO ARRAY arr

Что говорит результат.

1. Накладывается "фильтр" на табличку Master используя индекс F1 (оптимизация по Цруку ЬюА1 = 1)
2. На таблицу Details "фильтр" не накладывается, поскольку нет в секции where
3. После чего происходит обьединение двух таблиц, где уже используется индекс Master_f1 для таблицы Details.

Отсюда вывод, что оптимизатор фокса не "лопатит" таблицу деталей всю, ну естественно если по полю/условию связки (join) есть индекс.
...
Рейтинг: 0 / 0
29.01.2009, 10:28
    #35784654
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к табличке с группировкой
Вот это

автор (оптимизация по Цруку ЬюА1 = 1)

читать как

(оптимизация по Where M.f1 = 1)

PS раскладка не переключилась.
...
Рейтинг: 0 / 0
29.01.2009, 11:26
    #35784811
kiruha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к табличке с группировкой
PaulWist,

В статье другой запрос (беру самый простой случай )
Код: plaintext
1.
2.
3.
4.
5.
SELECT
   tabMain.*, tabChild.* 
FROM tabMain 
INNER JOIN tabChild ON tabMain.tabMainID=tabChild.tabMainID 
WHERE 
  tabChild.CurDate IN (SELECT MAX(CurDate) FROM tabChild GROUP BY tabMainID)

В 95% случаях пользователям не нужны все записи .
Например отбор по полю Country родительской таблицы, получаю :

Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT 
  tabMain.*, tabChild.* 
FROM tabMain 
INNER JOIN tabChild ON tabMain.tabMainID=tabChild.tabMainID 
WHERE 
 (tabChild.CurDate IN (SELECT MAX(CurDate) FROM tabChild GROUP BY tabMainID) )
AND (tabMain.Country ='CHINA')

И даже если в родительской всего 2 записи, подзапрос
Код: plaintext
(SELECT MAX(CurDate) FROM tabChild GROUP BY tabMainID) 
приведет к просмотру всей дочерней таблицы tabChild . А размер таблички
у меня, например, может быть 50 Мб.
...
Рейтинг: 0 / 0
29.01.2009, 11:55
    #35784946
kiruha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к табличке с группировкой
не нужно ли писать это подзапрос как

Код: plaintext
1.
WHERE 
 (tabChild.CurDate IN(SELECT MAX(a.CurDate) FROM tabChild a GROUP BY a.tabMainID WHERE tabMain.tabMainID=a.tabMainID ) ) 

кстати у автора именно такой получился
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запрос к табличке с группировкой / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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