我有一个数据库,每周添加两种类型的报告,但日期不同: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
答案 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;