我是 SQL 的新手,我正在尝试编写一个查询来查找上次读取水表的时间,以便我可以看到该值。有一个包含仪表的属性表和另一个存储工程师输入的仪表表。每个输入都列为一个序列,一个关键字列出了输入的类型,表达式列出了它们的条目。最大序列并不总是答案。
我正在寻找的是最后一次读取水表的时间,然后还从存储在上一个条目(序列)中的读数中获取电值。为了让工程师更难输入序列号,有些按一个 (1,2,3),有些按两个 (2,4,6),因此前一个条目可能是负一或负二。
我可以编写查询来查找最大序列,然后编写另一个查询来查找前一或前两个条目,但无法弄清楚如何将其放入一个查询中。
要找到站点 12345 的最大序列,我有:
SELECT MAX(M.SEQUENCE) maxseq
FROM METERS M JOIN PROPERTY P ON M.PROPNUM = P.PROPNUM
WHERE (P.CORP_ID ='12345' AND M.KEYWORD = 'WTR')
我之前手动搜索条目以使用以下查询获取电力条目。
SELECT P.NAME, P.CORP_ID, M.KEYWORD, M.SEQUENCE, M.EXPRESSION
FROM METERS M JOIN PROPERTY P ON M.PROPNUM = P.PROPNUM
WHERE (P.CORP_ID ='12345')
ORDER BY M.SEQUENCE
我尝试过不同的嵌套查询,但无法编写任何有用的东西。
我对米表感兴趣的数据如下所示:
PROPNUM SEQUENCE KEYWORD EXPRESSION 10a124 95 ELC 9845 10a124 96 WTR 4521 10a124 97 SVC A105 10a124 98 HEALTH GOOD 10a124 99 DAY 150209 10a124 100 HEALTH GOOD 10a124 101 ELC 10283 10a124 102 WTR 4621
我使用属性表来查找我感兴趣的站点的 PROPNUM,因为我有该站点的 ID (CORP_ID) 但没有它的 PROPNUM 值。
我想要返回的结果如下所示。
NAME WTR_EXPRESSION ELC_EXPRESSION SMITH 4621 10283
最佳答案
您可以为每个KEYWORD
将METER
表inner join
到PROPERTY
表一次,并指定'ELC'
的 SEQUENCE
(猜测 KEYWORD
)小于 'WTR' SEQUENCE
。由于您使用的是 SQL SERVER,我们可以在 CTE 中执行此操作和 inner join
数据集到 METER
表,以在单行中显示每个 KEYWORD
的 EXPRESSION
值:
;with wtr_elc as (
select
p.PROPNUM,
p.NAME,
max(w.SEQUENCE) as max_wtr_seq,
max(e.SEQUENCE) as max_elc_seq
from PROPERTY as p
inner join METERS as w
on w.PROPNUM = p.PROPNUM
w.KEYWORD = 'WTR'
inner join METERS as e
on e.PROPNUM = p.PROPNUM
and e.KEYWORD = 'ELC'
and e.SEQUENCE < w.SEQUENCE
where p.CORP_ID ='12345'
group by
p.PROPNUM,
p.NAME)
select
wtr_elc.NAME,
wtr.EXPRESSION as WTR_EXPRESSION,
elc.EXPRESSION as ELC_EXPRESSION
from METERS as wtr
inner join wtr_elc
on wtr_elc.PROPNUM = wtr.PROPNUM
and wtr_elc.max_wtr_seq = wtr.SEQUENCE
inner join METERS elc
on wtr_elc.PROPNUM = elc.PROPNUM
and wtr_elc.max_elc_seq = elc.SEQUENCE
and elc.KEYWORD = 'ELC'
where wtr.KEYWORD = 'WTR'
如果您想对更多或所有PROPERTY
记录执行此操作,您可以修改CTE
中的where
子句。
关于sql - 我正在尝试编写一个 SQL 嵌套查询来查找/使用最大值来查找最大值之前的条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28415541/