选择带有过滤器和日期的倒数第二条记录
Posted
技术标签:
【中文标题】选择带有过滤器和日期的倒数第二条记录【英文标题】:Select penultimate record with filter and date 【发布时间】:2018-03-05 17:46:40 【问题描述】:我想使用产品名称如何过滤来选择倒数第二条记录(按日期)。
通过这个查询,我选择了我有记录的所有日期。
select distinct(lstfchdes) from precios (nolock) where lstfchdes > '01/01/2018'
order by lstfchdes desc
在红框的图像中标记倒数第二条记录。
我使用distinct
,因为在确定的日期我有不止一个寄存器。
通过这个查询,我选择倒数第二条记录。
SELECT lstfchdes FROM precios (nolock)
WHERE lstfchdes = (SELECT MAX(lstfchdes)
FROM precios (nolock)
WHERE lstfchdes < (SELECT MAX(lstfchdes)
FROM precios (nolock)))
发现没问题。见图 2。我在这个查询中没有使用 distinct,所以在一个日期中看到多个寄存器的逻辑也是如此。 (将此结果与 Image1 进行比较)
我的问题是当我在查询中应用过滤器时,例如:
select * from precios (nolock)
WHERE prdid='PRO167' and lstid='L04'
order by lstpfchupd desc
倒数第二个记录是2018-03-03。
但是如果我执行这个查询:
SELECT lstfchdes FROM precios (nolock)
WHERE lstfchdes = (SELECT MAX(lstfchdes)
FROM precios (nolock)
WHERE lstfchdes < (SELECT MAX(lstfchdes)
FROM precios (nolock)))
and prdid='PRO167' and lstid='L04'
如果2018-03-05在外面的倒数第二个记录返回结果如何:
可能是什么问题?
【问题讨论】:
PANULTIMATE
记录总是第二个不同的行吗?您可能需要为所有 SELECT
语句或子查询应用过滤条件。
并且小心将 nolock 提示溅到各处。它有一长串附加漂亮功能的清单。诸如随机丢失和/或重复行之类的事情。 blogs.sentryone.com/aaronbertrand/bad-habits-nolock-everywhere 如果您坚持使用表格提示,则必须包含 WITH 关键字,省略它已被弃用。
您考虑过使用 ROW_NUMBER 吗?这通常是处理这些类型的事情的方式。
@clinomaniac 是的!发现。需要在所有条件下应用过滤器的原因是什么?
@FedericoMartinez 我已经发布了答案。让我知道是否有帮助或您需要更多信息。
【参考方案1】:
您需要为所有SELECT
语句应用过滤器。这是因为您的聚合还需要应用过滤器。否则,您的 MAX
和类似的聚合将没有过滤器,并会导致不正确的结果。
【讨论】:
以上是关于选择带有过滤器和日期的倒数第二条记录的主要内容,如果未能解决你的问题,请参考以下文章