假设我有一张看起来像这样的表:
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进行初始数据提取)
答案 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;
结果(根据您的数据):
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