根据另一个字段的最大值选择记录

时间:2019-10-22 19:59:01

标签: visual-foxpro

我正在尝试根据土地面积字段的最大值来提取不同城市名称及其纬度和经度的列表。我得到的最好的是“ SQL:错误关联字段”错误。

Function getNonBlankRowNums(arr, Optional ByVal col = 1) As Variant()
' Purpose: return 1-dim array with remaining non-blank row numbers
  Dim i&, ii&, tmp
  ReDim tmp(1 To UBound(arr))
  For i = 1 To UBound(arr)
      If arr(i, col) <> vbNullString Then   ' check for non-blanks
          ii = ii + 1                       ' increment temporary items counter
          tmp(ii) = i                       ' enter row number
      End If
  Next i
  ReDim Preserve tmp(1 To ii)               ' redim to final size preserving existing items
' return function value (variant array)
  getNonBlankRowNums = tmp
End Function

不确定这样做是否还能奏效,希望能有所帮助。

谢谢。

2 个答案:

答案 0 :(得分:0)

VFP不支持这种SQL。您可以这样写:

select *
from mytable
where 
(
  select min(account_number)
  from
  (
    select
      account_number,
      count(*) over (order by account_number range between 59999 preceding and current row) as cnt
    from mytable
  ) viewed
  where cnt = 60000
) between account_number and account_number + 59999
order by account_number;

答案 1 :(得分:0)

VFP根本没有“这样的SQL”问题,这与Basoz大师在此问题上的宣布相反。

通常,由于land_areamax(val(land_area))的比较,您应该收到类型不匹配错误。 Fox不像MS SQL Server那样急于进行隐式转换,因此您必须正确匹配数据类型。

但是,不知道您的表结构是什么,很难提供有关问题可能出在哪里的特定指针。这是两个类似的查询,使用VFP中可用的示例数据(使用运费作为land_area值的替代品):

_VFP.DoCmd("set path to " + set("PATH") + ";" + _SAMPLES)

use Northwind/orders alia nw_orders in sele("nw_orders") shar noup agai

sele o.shipcountry, o.shipcity, o.shipname, o.orderid, o.freight ;
   from nw_orders o ;
   wher o.freight == ( ;
      sele max(x.freight) from nw_orders x wher x.shipcountry == o.shipcountry ) ;
   orde by 1 ;
   into curs nw_result
brow last nowa

use Tastrade/orders alia tt_orders in sele("tt_orders") shar noup agai

sele o.ship_to_country, o.ship_to_city, o.ship_to_name, o.order_number, o.freight ;
   from tt_orders o ;
   wher o.freight == ( ;
      sele max(x.freight) from tt_orders x wher x.ship_to_country == o.ship_to_country ) ;
   orde by 1 ;
   into curs tt_result
brow last nowa

Tastrade和Northwind的结构非常相似,并且包含非常相似的数据; VFP安装中应有一个可用。但是,这两个示例数据库似乎都没有出现在公共领域,至少没有出现在VFP的化身中。这就是为什么我将Northwind放在第一位的原因,因为它是MS SQL Server等版本的公共版本,并且将其订单表转储为Fox格式不会带来无法克服的困难。

这是一个用于通过OLEDB运行Northwind查询的C#LINQPad脚本:

const string DIR = @"d:\dev\sub\FoxIDA\data\Northwind\";
const string SQL = @"
sele o.shipcountry, o.shipcity, o.shipname, o.orderid, o.freight
   from orders o
   wher o.freight == (sele max(x.freight) from orders x wher x.shipcountry == o.shipcountry) 
   orde by 1";

using (var con = new System.Data.OleDb.OleDbConnection("provider=VFPOLEDB;data source=" + DIR))
{
    using (var cmd = new System.Data.OleDb.OleDbCommand(SQL, con))
    {
        con.Open();
        cmd.ExecuteReader().Dump();         
    }
}

很显然,您需要将DIR定义修改为数据在计算机上的位置。同样显然,您必须使用32位版本的LINQPad,因为没有用于VFP的64位OLEDB驱动程序。结果如下:

LINQPad query result