2016-11-09 91 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 select语句获取单个记录?

+0

您是否有任何条件从每个组中获取单条记录,例如最新记录? – Viki888

+0

不幸的是,没有。没有ID或日期字段。 –

+0

然后慷慨地提供表架构 – Viki888

回答

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

此代码假定要从每个包组选择一个客户,而不管哪一个是(与分钟(客户ID)选择所述一个)的 - (它可能是最大值(客户ID),或使用更长的SQL,从每个组中挑选前1名 - 就像您使用unique做的那样 - 或者再次使用更长的SQL,按特定顺序排列,然后从每个组中挑选N个,如果需要随机选择选择)。

注意:这是一个黑客,我不会真的建议,并依靠版本7和更旧的bug。即:

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

我在我的搜索中看到了您的建议黑客,并希望找到替代方案,尤其是因为我没有客户ID字段允许我使用第一个查询。但时间不够,无论如何都是用它。不过,我稍后做了一些测试,并使用姓名或地址数据获得​​了可接受的结果,并将在未来使用。 –

+0

我明白了,你可以使用recno()创建一个'virtual'customerId,但是一张表应该有一个主键(在VFP自己的示例中,我们看到一个没有PK :() –

+0

这些文件不是生产数据库的一部分,但只是一次性使用的文件,Dbf恰好是美国商业邮件行业使用的标准格式 –

相关问题