SQL分组或子查询的语法,反向排序数据集需要单个字符串值而非数字汇总?

时间:2013-10-07 21:55:10

标签: sql crystal-reports

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

ProjectSts:

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

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

我想知道的是,如果可能的话,如何在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进行初始数据提取)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 Fiddle

结果(根据您的数据):

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