sql - 我正在尝试编写一个 SQL 嵌套查询来查找/使用最大值来查找最大值之前的条目

标签 sql sql-server sql-server-2012

我是 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

最佳答案

您可以为每个KEYWORDMETERinner joinPROPERTY表一次,并指定'ELC'SEQUENCE(猜测 KEYWORD)小于 'WTR' SEQUENCE。由于您使用的是 SQL SERVER,我们可以在 CTE 中执行此操作和 inner join 数据集到 METER 表,以在单行中显示每个 KEYWORDEXPRESSION 值:

;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/

相关文章:

sql - 是否可以将数据库列中的值更改为小写?

sql - SSIS 派生列舍入值

database - 如何正确使用SQL outfile 命令?

.net - 通过 SSIS 目录管理对象模型以编程方式验证 SSIS 2012 包

mysql - 需要在 MYSQL 中用 - 分隔符分隔字符串

mysql - SELECT 关键字位置错误

MySQL 非常慢的查询

sql - T-SQL 事务和表锁定

c# - Linq 插入 : The column name ' ' is specified more than once in the SET clause or column list of an INSERT

sql-server - 为什么查询优化器完全忽略索引 View 索引?