SQL连接和不同和最大问题

时间:2018-09-10 14:18:03

标签: sql sql-server

我有一个数据库,每周添加两种类型的报告,但日期不同:ActiveSystems,LicenseReports。两者都有报告日期,都有相应的序列号。

我需要一个SQL查询,该查询还提供所有最新的ActiveSystem,以及从最新日期开始的LicenseReport表中的第一个匹配行。这是一个示例:

ActiveSystem
ReportDate    SerialNo
9/03/18       111111
9/03/18       112211
9/03/18       114411
9/10/18       111111
9/10/18       112211
9/10/18       113311


LicenseReports
ReportDate    Serial_Number
9/7/18        111111
9/7/18        111111
9/7/18        112211
9/7/18        112211

我需要ActiveSystem列表中最新日期中的每个项目,但仅需要LicenseReport表中的第一个匹配序列号,该序列号可能存在​​也可能不存在。

到目前为止,我有这样的事情

SELECT * FROM [dbo].[ActiveSystemReports]  AS ASR 
LEFT JOIN [dbo].[LicenseReports] AS LCR ON ASR.SerialNo = LCR.Serial_Number
Where ASR.ReportDate >= (SELECT MAX(ReportDate) From [dbo].[ActiveSystemReports]) AND 
LCR.ReportDate >= (SELECT MAX(ReportDate) From [dbo].[LicenseReports])

但这不会返回第一个表中的所有记录,并且包含第二个表中所有匹配记录的重复项。任何帮助将不胜感激。谢谢。

我的预期输出是:

ActiveSystem                     LicenseReport
ReportDate    SerialNo  ect      ReportDate     Serial_Number
9/10/18       111111    ...      9/7/18         111111
9/10/18       112211    ...      9/7/18         112211
9/10/18       113311    ...      null           null

6 个答案:

答案 0 :(得分:1)

也许使用TOP 1 WITH TIES并按row_number排序以获得LicenseReports的ReportDate?

SELECT TOP 1 WITH TIES ASR.*, LCR.*
FROM [dbo].[ActiveSystemReports] AS ASR
LEFT JOIN [dbo].[LicenseReports] AS LCR
  ON ASR.SerialNo = LCR.Serial_Number
WHERE ASR.ReportDate = (SELECT MAX(ReportDate) FROM [dbo].[ActiveSystemReports])
ORDER BY ROW_NUMBER() OVER (PARTITION BY ASR.Serial_Number ORDER BY LCR.ReportDate DESC);

答案 1 :(得分:0)

您可以file = open("data_" + str(t)+".txt", "a") 获得LEFT JOIN的结果:

GROUP

答案 2 :(得分:0)

您可以使用OUTER APPLY代替左联接。 请检查以下查询以获取更多详细信息。

SELECT ASR.* , D.Serial_Number as LicenseReportsDate
FROM [dbo].[ActiveSystemReports]  AS ASR 
OUTER APPLY
(
    select TOP 1 Serial_Number from [dbo].[LicenseReports] AS LCR
    where LCR ON ASR.SerialNo = LCR.Serial_Number
    ORder by LCR.ReportDate DESC 
) as  D

答案 3 :(得分:0)

我的直觉告诉我这是你需要的帽子:

SELECT * FROM (
  SELECT AS.*, LR.ReportDate LicenseReportDate, ROW_NUMBER() OVER (PARTITION BY AS.SerialNo ORDER BY LR.ReportDate DESC) N
  FROM ActiveSystemReports AS
  LEFT JOIN LicenseReports LR ON AS.SerialNo=LR.Serial_Number
) T WHERE N=1

答案 4 :(得分:0)

SELECT * 
FROM [dbo].[ActiveSystemReports]  AS ASR 
LEFT JOIN (
    SELECT MIN(LCR.ReportDate), SerialNo
    FROM [dbo].[LicenseReports]
    GROUP BY SerialNo) AS LCR ON ASR.SerialNo = LCR.Serial_Number

获取同一序列的ASR记录和 first (按日期)LCR记录。问题不清楚,可能不是您真正想要的...

答案 5 :(得分:0)

我会使用APPLY

SELECT ASR.*, LCR.* 
FROM [dbo].[ActiveSystemReports] AS ASR OUTER APPLY
     ( SELECT TOP (1) LCR.*
       FROM [dbo].[LicenseReports] AS LCR
       WHERE LCR.Serial_Number = ASR.SerialNo 
       ORDER BY LCR.ReportDate DESC 
     ) LCR;