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

时间:2019-03-24 14:10:20

标签: sql-server

我正在尝试从两个表中为每个服务选择一个行register_date。

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

我该如何解决这个问题?

我必须从两个表中进行选择。

  • tServices
  • tRegister

我的代码是:

  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

1 个答案:

答案 0 :(得分: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有2个版本:

  • cross(相当于inner联接);
  • outer,它作为left outer联接。

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