如何从没有时间戳的日期列中选择前1个日期?

问题描述 投票:0回答:1

我试图从两个表中为每个服务只选择一行register_date。

但是,如果客户端具有更多具有相同register_date的行,则查询的输出包括多行。

我该如何解决这个问题?

我必须从两张桌子中选择。

  • tServises
  • 寄存器

我的代码是:

  SELECT tServices.Client_id, tRegister.register_date, 
         tServices.type_service, 
         tServices.start_date, tServices.end_date
  FROM tServices INNER JOIN tRegister
         ON tRegister.Client_id = tServices.ClientId AND 
            tServices.type_service IN (3,2)
  WHERE tRegister.register_date = 
                          (SELECT top 1 tRegister2.register_date
                          FROM tRegister as tRegister2
                          WHERE tRegister2.ClientId = tServices.ClientId
                          ORDER BY tRegister2.register_date asc)

对于一个客户端,输出如下所示,但我希望在输出中看到一行。

 Client_Id  register_date   Type_Service    Start_Date  End_Date

  1001    21-11-2018             2        17-01-2019    19-3-2019
  1001    21-11-2018             2        17-12-2018    19-3-2019
sql-server
1个回答
0
投票

您可以使用apply运算符:

select *
from tServices s
  cross apply (
  select top (1) * from tRegister r
  where r.Client_id = s.ClientId
  order by r.register_date
) ca;

请注意,有两个版本的apply

  • cross(相当于inner加入);
  • outer,作为left outer加入。

在上面的查询中,对于没有注册的客户端,您将看不到tServices中的任何行。如果您仍然需要它们,请将cross替换为outer

© www.soinside.com 2019 - 2024. All rights reserved.