用于同一表的多个查询的SQL结构(使用窗口函数、大小写、联接)

用于同一表的多个查询的SQL结构(使用窗口函数、大小写、联接),sql,join,presto,dense-rank,Sql,Join,Presto,Dense Rank,我有一个复杂的生产SQL问题。它实际上是PrestoDB Hadoop,但符合公共SQL 我必须从一个表中获取一系列指标,有点像这样(如果表被弄坏了,很抱歉): 我需要这样的东西: +--------+------------------+-------------------------+ | device | max_install_date | previous_account_number | +--------+------------------+-----------------

我有一个复杂的生产SQL问题。它实际上是PrestoDB Hadoop,但符合公共SQL

我必须从一个表中获取一系列指标,有点像这样(如果表被弄坏了,很抱歉):

我需要这样的东西:

+--------+------------------+-------------------------+
| device | max_install_date | previous_account_number |
+--------+------------------+-------------------------+
| dev 1  | 10-Jun           |                     456 |
| dev 2  | 25-Jun           |                      50 |
+--------+------------------+-------------------------+
select device, max(install_date) as max_install_date
from (select [a whole bunch of stuff], dense_rank() over(partition by device order by [something_else]) rnk
      from some_table a
      )
我可以执行两个单独的查询以获取最大安装日期和以前的帐号,如下所示:

+--------+------------------+-------------------------+
| device | max_install_date | previous_account_number |
+--------+------------------+-------------------------+
| dev 1  | 10-Jun           |                     456 |
| dev 2  | 25-Jun           |                      50 |
+--------+------------------+-------------------------+
select device, max(install_date) as max_install_date
from (select [a whole bunch of stuff], dense_rank() over(partition by device order by [something_else]) rnk
      from some_table a
      )
但是,如何将它们组合到一个查询中,为每个设备获得一行呢?我有秩、语句、case语句和一个join。它们都是单独工作的,但我正绞尽脑汁想知道如何将它们结合起来

我需要了解如何构造大型查询

附言:你有没有推荐一些关于高级SQL数据分析的好书?我在Amazon上看到了很多,但是没有任何东西告诉我如何构建这样的大型查询。我不是DBA。我是一个数据员

谢谢

您可以使用相关的
子查询
方法:

select t.*
from table t
where install_date = (select max(install_date) from table t1 where t1.device = t.device);
这假设
install\u date
具有resonbale日期格式

我想你想要:

select t.*
from (select t.*, max(install_date) over (partition by device) as max_install_date,
             lag(customer_account) over (partition by device order by install-date) as prev_customer_account
      from t
     ) t
where install_date = max_install_date;