1

假设我有一个看起来像这样的表:

项目:

ID   Proj  Status  LogDate    FundsRemain  LogBy
60   2     Quit    1/5/2013   Yes          QOVM
59   2     Quit    1/4/2013   Yes          YZYO
58   2     Quit    1/3/2013   No           XYZ
54   2     Start   1/1/2013   NA           QOVM
50   1     Quit    12/2/2012  Yes          UUOI
48   1     Quit    12/1/2012  Yes          OIJP

目前我正在做的是一个 SQL 语句SELECT * FROM ProjSts WHERE Status = 'Quit' AND FundsRemain = 'Yes'。然后,在另一个应用程序中,我让应用程序手动读取所有生成的项目状态条目,并为每个项目选择按时间顺序排列的第一个(最早)此类状态,以便将其导出到新表中。

我想知道的是,如果可能的话,如何在 SQL 语句中实现这一点。我查看了很多关于 SQL Group By 的教程,它们都显示了如果我想求和、平均等该怎么做……每个项目的所有条目的数字字段。我查看了一些关于子查询的教程,这些教程向我展示了如何生成一个 IN 列表,但我没有看到任何会生成一个后排序的第一条记录的列表,该列表满足另一个中每个唯一值的特定标准场地。

理想情况下,根据上面的示例数据,结果将是:

ID   Proj  Status  LogDate    FundsRemain  LogBy
48   1     Quit    12/1/2012  Yes          OIJP
59   2     Quit    1/4/2013   Yes          YZYO

抱歉,我不是最高级的 SQL 用户,但如果我可以让它在 SQL 中运行,而不是依赖外部应用程序然后返回并重新处理选择结果只是为了选择,那就太好了我真正需要的。

任何帮助将不胜感激(PS:这是来自 ctree 数据库,我目前正在使用水晶报告 2008 进行初始数据提取)

4

2 回答 2

0

根据您的 RDBMS,一种选择是使用MIN聚合将表连接到自身:

select p.*
from ProjSts p
  inner join (
    select min(LogDate) minLogDate, Proj
    from ProjSts
    where status='Quit' and FundsRemain = 'Yes'
    group by Proj
    ) p2 on p.Proj = p2.Proj and p.LogDate = p2.minLogDate

虽然我不确定CTree,但如果您的数据库支持Row_Number,这可能是一个更简单的解决方案:

select *
from (
  select *, 
    Row_Number() Over (Partition By Proj Order By LogDate) rn
  from ProjSts
  where status='Quit' and FundsRemain = 'Yes'
    ) p
where rn = 1
于 2013-10-07T22:02:47.070 回答
0

版本correlated sub-query(使用MySQL语法):

SELECT ct.*
FROM ctree ct
WHERE ct.logDate = (SELECT MIN(logDate) FROM ctree ct2 
                    WHERE ct.proj = ct2.proj AND 
                          status='Quit' AND 
                          fundsRemain='Yes') 
ORDER BY id;

SQL小提琴

结果(基于您的数据):

ID  PROJ    STATUS  LOGDATE                        FUNDSREMAIN  LOGBY
48     1    Quit    December, 01 2012 00:00:00+0000 Yes         OIJP
59     2    Quit    January, 04 2013 00:00:00+0000  Yes         YZYO 
于 2013-10-07T22:26:20.323 回答