sql-server - 如何在sql查询中的内连接和case语句上应用partition by和row_number()

标签 sql-server inner-join partition-by

我有一个sql查询

select b.logtime,
       b.beam_current,
       b.beam_energy,
       case when a.st2_vs2_bag1_onoff=0 then c.st2_vs2_bag1_rb ELSE 0 END
         as st2_vs2_bag1_rb,
       CASE when a.st2_vs2_bag8_onoff=0 then c.st2_vs2_bag8_rb else '0' END
         as st2_vs2_bag8_rb,
       CASE when a.st2_vs2_bag9_onoff=0  then c.st2_vs2_bag9_rb else '0' END
         as st2_vs2_bag9_rb 
from   INDUS2_BDS.dbo.DCCT b
       INNER JOIN (
         INDUS2_VACUUM.dbo.main_vacuum_analog c
         inner join INDUS2_VACUUM.dbo.main_vacuum_status a
           on c.logtime=a.logtime
       )
       ON a.LOGTIME = b.LOGTIME
         and (b.beam_current like '%9.96' etc)
         and b.logtime between '2014-08-09 00:00:00' and '2014-08-09 23:59:59'
         and b.beam_current in('10.01', '20.02', etc)
         and ( b.beam_energy between '550' and '551' )
order by b.logtime 

现在,在给定的日志时间内,单个beam_current值在不同的日志时间出现多次。我只想要一个不重复的beam_current值。为此,我想在上面的Sql查询中应用row_number并按beam_current进行分区。但是我'我不知道如何应用它。

最佳答案

做了一些更改

删除了Join条件中不需要的括号。在没有 ON 条件的 Join 中也存在错误,已更正它

然后仅保留 On 子句中的 join 条件,将过滤器移至 where 子句。

试试这个。

;WITH cte
     AS (SELECT b.logtime,
                b.beam_current,
                b.beam_energy,
                CASE
                  WHEN a.st2_vs2_bag1_onoff = 0 THEN c.st2_vs2_bag1_rb
                  ELSE 0
                END                     AS st2_vs2_bag1_rb,
                CASE
                  WHEN a.st2_vs2_bag8_onoff = 0 THEN c.st2_vs2_bag8_rb
                  ELSE '0'
                END                     AS st2_vs2_bag8_rb,
                CASE
                  WHEN a.st2_vs2_bag9_onoff = 0 THEN c.st2_vs2_bag9_rb
                  ELSE '0'
                END                     AS st2_vs2_bag9_rb,
                Row_number() OVER(partition BY b.beam_current
                    ORDER BY b.logtime) RN
         FROM   INDUS2_VACUUM.dbo.main_vacuum_analog c
                INNER JOIN INDUS2_VACUUM.dbo.main_vacuum_status a
                        ON c.logtime = a.logtime
                INNER JOIN INDUS2_BDS.dbo.DCCT b
                        ON a.LOGTIME = b.LOGTIME
         WHERE  b.beam_current LIKE '%9.96'
                AND b.logtime BETWEEN '2014-08-09 00:00:00' AND '2014-08-09 23:59:59'
                AND b.beam_current IN ( '10.01', '20.02' )
                AND b.beam_energy BETWEEN '550' AND '551')
SELECT logtime,
       beam_current,
       beam_energy,
       st2_vs2_bag1_rb,
       st2_vs2_bag8_rb,
       st2_vs2_bag9_rb
FROM   cte
WHERE  rn = 1
ORDER  BY logtime 

关于sql-server - 如何在sql查询中的内连接和case语句上应用partition by和row_number(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28696701/

相关文章:

sql-server - SQL Server 2008 对具有复合主键的表进行全文搜索

mysql - 正确显示第二个表中具有多个匹配项的 mySQL LEFT JOIN

MySQL独家获取 Action 片

group-by - groupby 并在 pyspark 中加入 vs 窗口

MySQL 查询更新除最新行之外的所有 "duplicate"行

java - 无法删除列 MSSQL(在 Hibernate 之后?)

c# - 我是否在 C# 函数中适本地关闭了这个 SQL 连接?

clojure:根据值的序列划分序列

java - 将android连接到远程sql server

mysql - 将表 1(外键)中的 2 列连接到表 2(主键) - 如何避免 JOIN BUFFER?