【问题标题】:Query optimisation (autonumbering)查询优化(自动编号)
【发布时间】:2021-02-21 07:15:03
【问题描述】:

我有这两张表(简化),可以包含很多约会和很多情节

约会

date       | person_id | episode_id  
-----------+-----------+------------
12-11-2019 |    1      |    1
18-10-2019 |    1      |    1
11-10-2019 |    1      |    1
10-12-2018 |    1      |    2
10-11-2018 |    1      |    2

剧集

episode_id | Name
-----------+------------
    1      | Episode 1
    2      | Episode 2

现在我需要列出一集中的约会编号(按顺序)。

所以查询的结果是:

Appointment | Episode    | Appointment number
------------+------------+----------------------
12-11-2019  | Episode 1  |     3
18-10-2019  | Episode 1  |     2
11-10-2019  | Episode 1  |     1
10-12-2018  | Episode 2  |     2
10-11-2018  | Episode 2  |     1

所以我的查询(简化)如下所示:

select 
    a.date, e.name, 
    (select count(*) from appointment a1 
     where a1.espisode_id = a.episode_id and a1.date < a.date ) + 1 
From 
    appointment a 
join 
    episode e on e.episode_id = a.episode_id 
where 
    a.person_id = 1

现在这工作正常,但 sub select 语句正在杀死数据库。我们获得了超过 500 万次预约和超过 100 万集。

有什么想法可以优化这个,所以它的数据库负担更轻?

【问题讨论】:

    标签: sql sql-server count subquery inner-join


    【解决方案1】:

    使用窗口函数!

    select a.date, e.name, 
        row_number() over(partition by a.episode_id order by a.date) as appointment_number
    from appointment a 
    inner join episode e on e.episode_id = a.episode_id 
    where a.person_id = 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-01
      • 2013-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-16
      相关资源
      最近更新 更多