【问题标题】:How to apply partition by and row_number() on inner join and case statement in sql query如何在sql查询中的内部连接和case语句上应用分区和row_number()
【发布时间】:2015-02-24 13:10:01
【问题描述】:

我有一个 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 

现在在给定的 logtime 中,单个 beam_current 值在不同的 logtime 多次出现。我只希望 beam_current 的一个值不重复。为此,我想在上面的 Sql Query 中应用 row_number 并按 beam_current 分区。但是我'我不知道如何应用它。

【问题讨论】:

    标签: sql-server inner-join partition-by


    【解决方案1】:

    做了一些改动

    删除了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 
    

    【讨论】:

    • @tiddirastogi 你确定你没有修改就运行了上面的查询,因为我没有看到任何错误
    • @NoDisplyName ,当我在 java 类中使用此查询时,我在 'INDUS2_VACUUM' 附近的语法不正确上遇到错误。但在 sql server 中它的工作。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 2022-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多