【发布时间】: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 我已经发布了答案。让我知道是否有帮助或您需要更多信息。
标签: sql sql-server