我在下面有一个查询,它是更大查询的一部分。我打算根据1)返回一个结果。就业ID 2.)费率的变更日期。 3.)特殊规则,如果存在的话。
SELECT TOP 1 rate
FROM Rate2
WHERE Rate2.entityno = 805181
AND Rate2.changedate <= [01/01/2011]
AND IIF(Rate2.SpecialRules = 'SpecialCase',
Rate2.SpecialRules = 'SpecialCase',
Rate2.SpecialRules = "NA")
ORDER BY Rate2.changedate DESC;
这是“Rate2”表的摘录
EntityNo| ChangeDate| Rate| SpecialRules
805181| Jan-01-2010| 178.00| NA
805181| Jul-28-2012| 185.00| NA
805181| Jan-01-2010| 204.00| 'SpecialCase'
在查询时,我返回204和178的费率。 我只想要“204”,如果我输入'specialCase',或178,如果我输入“NA”。任何帮助将不胜感激。
谢谢你,我正在使用Access 2013.
答案 0 :(得分:2)
如果您的订单设置为包含多个结果的值,那么前1行将具有符合此条件的多个(日期)值。
因此,顶部的“1”值可能导致200行成为前1值。
因此,您有超过一个最佳日期。如果您引入了第二个订单值,那么再次使用相同的规则,但现在基于两列。通过ASC排序,只有一行具有最高值。如果您通过DESC订购,那么显然有一行(date + SpeicalRules)存在且具有相同的值。
因此,更改顺序肯定会影响该数据集的“第一”或前1位的行数。
如果speicalRules具有重复值,并且具有相同的日期,那么使用top 1可以生成多个具有相同值的行。通过更改顺序,只有一个实际的数据行显示在顶部而不重复值。
如果您不在乎,并且只需要/想要结果的第一行即使存在多个日期?然后只需将主键值添加到排序中。
例如:
ORDER BY Rate2.changedate DESC , Rate2.ID
这将导致按行查询,即使许多日期相同,也只会返回一行。
以上将返回相同日期的第一组。假设自动编号递增,那么可以通过翻转PK的排序顺序来获得相同日期的最后一个最高日期:
ORDER BY Rate2.changedate DESC , Rate2.ID DESC
因此,某些内容的最高行基于您在ORDER BY子句中包含的列。如果行重复,那么顶部1将导致多于一行是最顶部的值。
因此,将PK列添加到ORDER可确保所有行因此对TOP 1子句是唯一的。所以TOP 1只是由order by子句中包含的行驱动。
答案 1 :(得分:0)
per sgeddes
我已修改为在order by子句中包含另一个唯一字段。
SELECT TOP 1 rate
FROM Rate2
WHERE Rate2.entityno = p.[test value 1]
AND Rate2.changedate <= [01/01/2011]
AND IIF(Rate2.SpecialRules = 'NewRule',
Rate2.SpecialRules = 'NewRule',
Rate2.SpecialRules = "NA")
ORDER BY Rate2.changedate DESC , rate2.SpecialRules ASC;
现在它可以工作,但只有当rate2.specialrules是ASC而不是DESC时。任何人都可以建议ASC和DESC如何影响文本记录?