【问题标题】:Pervasive SQL 2000i Database Last Transaction QueryPervasive SQL 2000i 数据库上次事务查询
【发布时间】:2021-02-10 01:29:59
【问题描述】:

我有一个旧数据库,名为:Pervasive SQL 2000i,这个数据库来自 90 年代末和 2000 年代初。文档很少,除了来自 Actian(称为 Zen)和 Goldstar Software(很友好地回答我的问题)。这篇文章是关于如何查询每个不同时期的数据的问题。这个问题可能适用于所有数据库,因为这只是一个标准的 SQL 语句,但是对于我来说,我仍然很难在单个 SQL 语句上检索数据。

我有一个如下所示的 Pervasive 表:

CREATE TABLE `NLBAL` (
    `acct` VARCHAR(32),
    `PerioEndDate` DATE,
    `Amt` DECIMAL,
    `YTDAmt` DECIMAL
);

(由 wtools 创建表)

然后是部分数据:

Acct                PeriodEndDate    Amt               YTDAmt          
01212121221220      2017-11-30       -5000             40000 
01212121221220      2017-12-31       -5000             40000          
12010111111111      2020-09-31       -4000             12000           
12010111111111      2020-10-31       1000              80000    

   

如果我使用这个 SQL 语句:

SELECT Acct,PeriodEndDate,Amt,YTDAmt FROM NLBAL 
WHERE PeriodEndDate = (SELECT Max(PeriodEndDate) FROM NLBAL)

当然,结果仅基于“最大”日期,将忽略其他帐户的先前日期,它将显示所有具有等效 = 最大日期的记录,并忽略那些没有的记录(预期结果):

Acct                PeriodEndDate    Amt               YTDAmt          
12010111111111      2020-10-31       1000              80000  

如我们所见,我的查询无法从帐户“01212121221220”中获取结果,该帐户具有 2017 年的最后一次记录交易,并且由于 2020-10-31 是表上的最新记录,数据库将使用该日期过滤结果。

我希望结果是:

Acct                PeriodEndDate    Amt               YTDAmt          
01212121221220      2017-12-31       -5000             40000                   
12010111111111      2020-10-31       1000              80000  

我只想查询所有账户及其对应的最后一笔交易(1 条记录),不管是哪个日期,只要它是每个账户的最后一笔交易。这意味着结果需要为每个帐户只记录一条记录,其中记录的交易是基于最大/最晚日期的最后一个交易。

我该怎么做?

感谢您的建议。

【问题讨论】:

    标签: sql pervasive zen


    【解决方案1】:

    好的,我最终这样做了:

    SELECT Acct,Max(PeriodEndDate) as PeriodEndDate FROM NLBAL     
    WHERE ACCT IN
    ('01212121221220','12010111111111')
    GROUP BY Acct --(I actually have more than 600 records to query.)
    

    将结果导出到包含 Acct、PeriodEndDate 列的新表“ACCTPRD”。

    然后我使用这个查询:

    SELECT DISTINCT Acct,PeriodEndDate,Amt,YTDAmt FROM NLBAL 
    WHERE PeriodEndDate in (SELECT PeriodEndDate FROM ACCTPRD WHERE Acct=NLBAL.Acct)
    

    然后我得到了我想要的结果。但是,我愿意接受比我这里的建议更优化的建议。

    谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多