2016-11-09 6 views
0

Я надеюсь найти простое SQL-решение для моего вопроса. Я искал один, но не смог найти ничего, что сработает для моей ситуации.Запрос Foxpro для выбора одной записи из каждой группы

У меня есть .dbf с данными клиента, состоящий из имен клиентов, адресов и другой информации, предназначенных для коммерческой рассылки. Каждая запись присваивается группе или пакету, и каждый пакет будет отправлен отдельно. Иногда мне нужно вытаскивать записи из одной или нескольких групп, в новую dbf, настраивать как семена клиента, обновлять их новыми именами и адресами, чтобы клиент получал копию письма по почте. Обычно это только одна или две группы, и в этом случае я могу просто выбрать первую запись или найти две последовательные записи, принадлежащие разным группам. В настоящее время у меня есть файл с 6 группами, и мне нужна одна запись из каждой группы.

В основном я хочу сделать следующее, но я знаю, что эта команда не работает.

select * from customer group by package into table seeds 

Один из способов сделать это было бы сделать следующее:

use customer 
index on package unique 
set order to package 
copy to seeds 
delete tag all 

С другой стороны, я мог бы скопировать одну запись из каждой группы в отдельные файлы, а затем добавить их в один файл семян.

Есть ли способ получить одну запись из каждой группы с помощью оператора выбора sql?

+0

Есть ли у вас какие-либо условия, чтобы получить единственную запись из каждой группы, например, последнюю запись? – Viki888

+0

К сожалению, нет. Нет полей идентификатора или даты. –

+0

Затем любезно предоставите схему таблицы – Viki888

ответ

1
Select * From Customers ; 
    where CustomerId In ; 
     (Select Min(CustomerId) From Customers Group By package) ; 
    order By package ; 
    into Cursor crsResult ; 
    nofilter 

Этот код предполагает, что вы хотите, чтобы выбрать один клиент из каждой группы пакетов, независимо от того, какой из них, который (выбирая один с мин (CUSTOMERID)) - (это может быть не более (CustomerId) или, используя более длинный SQL, выберите верхнюю часть 1 из каждой группы - например, вы сделали с уникальным - или, опять же, с гораздо более длинным SQL-заказом в определенном порядке, и выберите Nth для каждой группы или произвольный выбор из каждой группы, если вам нужна рандомизация на выбирает).

Примечание: Это хак, который я бы не предложил, и полагается на ошибку в версиях 7 и старше. то есть:

Set EngineBehavior 70 
*** Last physically entered from each group 
Select * From Customers ; 
    group By package ; 
    into Cursor result ; 
    nofilter 
Browse 

*** Or ordered by something - this one corresponds to unique index trick 
Select * from ; 
(Select * From Customers order by 1 desc) t ; 
    group By Package ; 
    into Cursor result ; 
    nofilter 
browse 
Set EngineBehavior 90 
+0

Я видел ваш предложенный взлом в моих поисках и надеялся найти альтернативу, тем более, что у меня не было поля идентификатора клиента, чтобы я мог использовать первый запрос. но не хватало времени и использовал его в любом случае. Однако позже я провел некоторое тестирование и получил приемлемые результаты, используя данные имени или адреса, и буду использовать их в будущем. –

+0

Я вижу, вы можете создать «virtual» customerId с помощью recno(), но таблица должна иметь первичный ключ в любом случае (в собственных образцах VFP мы видим один без PK :() –

+0

Эти файлы не являются частью производственной базы данных, но только одноразовые файлы. Dbf просто является стандартным форматом, используемым в коммерческой почтовой индустрии здесь, в США. –