选择带有过滤器和日期的倒数第二条记录

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 和类似的聚合将没有过滤器,并会导致不正确的结果。

【讨论】:

以上是关于选择带有过滤器和日期的倒数第二条记录的主要内容,如果未能解决你的问题,请参考以下文章

如何从访问表中获取选择性记录

日期范围过滤器中的 AND 语句

python-django-查询详解

python-django-查询详解

Discord Bot - 如何删除倒数第二条最近的消息?

奇怪的错误,collectionView 视图滚动到倒数第二条消息,当试图滚动到底部