Sql 在编写查询以每“一”选择一行时遇到问题;日期;,在一定条件下
在特定条件下,我在编写查询以选择每个“日期”一行时遇到问题。我的表格具有以下结构: ID date expiration callput iv delta 1 1/1/2009 1/20/2009 C 0.4 0.61 2 1/1/2009 1/20/2009 C 0.3 0.51 3 1/1/2009 2/20/2009 C 0.2 0.41 ID日期到期callput iv delta 1 1/1/2009 1/20/2009 C 0.40.61 2 1/1/2009 1/20/2009 C 0.30.51 3 1/1/2009 2/20/2009 C 0.20.41 我想编写一个具有以下特征的查询:Sql 在编写查询以每“一”选择一行时遇到问题;日期;,在一定条件下,sql,ms-access,Sql,Ms Access,在特定条件下,我在编写查询以选择每个“日期”一行时遇到问题。我的表格具有以下结构: ID date expiration callput iv delta 1 1/1/2009 1/20/2009 C 0.4 0.61 2 1/1/2009 1/20/2009 C 0.3 0.51 3 1/1/2009 2/20/2009 C 0.2 0.41
- 对于每一行,计算“天数”,即到期日期减去日期。例如,对于第一行,“天”是19(1/20减去1/1)
- 结果集应该只有“天”在15到50之间的行
- “callput”值必须为“C”
- 对于每个日期,仅显示一行。该行应具有以下特征:
- 增量应大于0.5
- 增量应为大于0.5的最小数字
- 如果有两行,则应选择天数较低的行
SELECT date, Min(delta) AS MaxOfdelta, [expiration]-[date] AS days
FROM RAWDATA
WHERE (((delta)>0.5) AND ((callput)="C") AND (([expiration]-[date])>=15 And ([expiration]-[date])<=50))
GROUP BY date, [expiration]-[date]
ORDER BY date;
选择日期,最小值(增量)为MaxOfdelta,[expiration]-[date]为天
从原始数据
其中(((delta)>0.5)和((callput)=“C”)和(([expiration]-[date])>=15和([expiration]-[date])您可以做的是在子查询中选择正确的行。此查询应该找到您要查找的行:
select [date], min([expiration]-[date])
from rawdata
where delta > 0.5
and callput = 'C'
and [expiration]-[date] between 15 and 50
group by [date]
要查找属于这些行的增量,请将其放入子查询中并对其进行联接:
select *
from rawdata
inner join (
select [date]
, min([expiration]-[date]) as days
from rawdata
where delta > 0.5
and callput = 'C'
and [expiration]-[date] between 15 and 50
group by [date]
) as filter
on filter.date = rawdata.date
and filter.days = rawdata.[expiration] - rawdata.[date]
where delta > 0.5
and callput = 'C'
要在具有相同“天”的行中搜索最低的增量,可以添加另一个子查询:
select
SubDaysDelta.date
, SubDaysDelta.MinDays
, SubDaysDelta.MinDelta
, min(rawdata.iv) as MinIv
from rawdata
inner join (
select
SubDays.date
, SubDays.MinDays
, min(delta) as MinDelta
from rawdata
inner join (
select [date]
, min([expiration]-[date]) as MinDays
from rawdata
where delta > 0.5
and callput = 'C'
and [expiration]-[date] between 15 and 50
group by [date]
) as SubDays
on SubDays.date = rawdata.date
and SubDays.MinDays = rawdata.[expiration] - rawdata.[date]
where delta > 0.5
and callput = 'C'
group by SubDays.date, SubDays.MinDays
) as SubDaysDelta
on SubDaysDelta.date = rawdata.date
and SubDaysDelta.MinDays = rawdata.[expiration] - rawdata.[date]
and SubDaysDelta.MinDelta = rawdata.delta
where delta > 0.5
and callput = 'C'
group by SubDaysDelta.date, SubDaysDelta.MinDays, SubDaysDelta.MinDelta
第一个子查询“SubDays”搜索“days”最低的行。第二个子查询“SubDaysDelta”搜索“SubDays”集中的最低增量。外部查询过滤剩余的任何重复项
如果您使用视图,它将更具可读性和可维护性。第一个视图可以根据callput和15-20天的限制进行过滤。这将使它变得更容易。VBA
我希望我能像安德奥马尔那样彻底、专注、乐于助人。我只能在对他的敬畏中投票支持他的答案
然而,我要指出的是,也许有一些令人信服的理由可以让你转向VBA。即使你是VBA新手,控制和解决问题的好处可能会让你走在前面。我想任何新的学习都会对你项目的其他方面有所帮助
我希望我能像Andomar那样提供一个完整的答案。但是,给它一个重击。Wow,几乎就是这样!我不得不添加一个“as”和过滤器(就在子查询之后)。然而,访问现在被这行阻塞了:“and filter.days=MIN([expiration]-[date])。它不断地说:“不支持连接表达式”。我遗漏了什么?谢谢!哦,那里不应该有MIN()。编辑了查询。谢谢Andomar!不幸的是,rawdata
表中有多行具有相同的“天数”。在第一个子查询中是否有方法检索ID列,以便我们可以针对该列进行联接?:-)无法选择ID,因为您没有对其进行分组;而按ID分组将无法达到目的。我能想到的唯一方法是添加另一个子查询。在答案中添加了这个。哇,安多玛,再次感谢你!这很有效!我犯了3个小错误:1。有一些关于“SybDaysDelta”的引用,我将其改为“SubDaysDelta”2。我把上面的“and SubDays.*days*=rawdata.[expiration]-rawdata.[date]”改为“and SubDays.*MinDays*=rawdata.[expiration]-rawdata.[date]”和3。我把“15到20岁”改为“15到50岁”。再次感谢你,安多玛!