最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

sql - How would I create a query in MS ACCESS to consolidate rows based on max date for multiple columns - Stack Overflow

programmeradmin2浏览0评论

I was trying to figure out a way to consolidate data to pick the most current Number and Number2 based on its corresponding Max(Date_Number).

DATA

ID Employee Date_Number Number Date_Number2 Number2
1 1234567 2/10/2025 1 2/1/2025 3
2 1234567 2/1/2025 5 2/2/2025 7
3 1234567 2/14/2025 4 2/4/2025 5
4 7777777 2/4/2025 1 2/4/2025 1
5 7777777 2/9/2025 3 2/1/2025 0

I was trying to figure out a way to consolidate data to pick the most current Number and Number2 based on its corresponding Max(Date_Number).

DATA

ID Employee Date_Number Number Date_Number2 Number2
1 1234567 2/10/2025 1 2/1/2025 3
2 1234567 2/1/2025 5 2/2/2025 7
3 1234567 2/14/2025 4 2/4/2025 5
4 7777777 2/4/2025 1 2/4/2025 1
5 7777777 2/9/2025 3 2/1/2025 0

EXPECTED

Employee Date_Number Number Date_Number2 Number2
1234567 2/14/2025 4 2/4/2025 5
7777777 2/9/2025 3 2/4/2025 1

Tried making separate tables for each to find the max(date_number) and max(date_number2) but couldn't pull back the corresponding number or number 2 that was next to the max date.

Share Improve this question edited Feb 14 at 17:28 June7 21.4k8 gold badges27 silver badges35 bronze badges asked Feb 14 at 15:06 ArmArm 12 bronze badges 0
Add a comment  | 

1 Answer 1

Reset to default 1

You can either

  • build two queries, each using a nested TOP N per group structure (http://allenbrowne/subquery-01.html#TopN), or
  • build two queries, each with nested aggregate query to get max values that INNER JOINs to sample table with compound join on Employee and date fields.

In either case, add INNER JOIN resulting two queries to each other or LEFT JOIN to Employees table if you want more employee data. Also, if an employee might not have a record for either number set, JOIN to Employees table where each employee must have a single record.

Using TOP N:

SELECT Employee, Date_Number, Number 
FROM Data 
WHERE ID IN (SELECT TOP 1 ID 
             FROM Data AS Dupe 
             WHERE Dupe.Employee = Data.Employee 
             ORDER BY Dupe.Date_Number DESC);

SELECT Employee, Date_Number2, Number2 
FROM Data 
WHERE ID IN (SELECT TOP 1 ID 
             FROM Data AS Dupe 
             WHERE Dupe.Employee = Data.Employee 
             ORDER BY Dupe.Date_Number2 DESC);

Using aggregation:

SELECT Data.Employee, Data.Date_Number, Data.Number 
FROM Data 
INNER JOIN (SELECT Employee, Max(Date_Number) AS MDN 
            FROM Data 
            GROUP BY Employee) AS Q 
      ON (Data.Employee=Q.Employee) AND (Data.Date_Number = Q.MDN);

SELECT Data.Employee, Data.Date_Number2, Data.Number2 
FROM Data 
INNER JOIN (SELECT Employee, Max(Date_Number2) AS MDN 
            FROM Data 
            GROUP BY Employee) AS Q 
      ON (Data.Employee=Q.Employee) AND (Data.Date_Number2 = Q.MDN);

Final query (if each employee is sure to have a record for each number set):

SELECT Query1.*, Query2.* 
FROM Query2 
INNER JOIN Query1 ON Query2.Employee = Query1.Employee;

Otherwise, JOIN to Employees table

SELECT Employees.EmployeeNum, 
       Query1.Date_Number, 
       Query1.Number, 
       Query2.Date_Number2, 
       Query2.Number2
FROM (Employees LEFT JOIN Query1 ON Employees.EmployeeNum = Query1.Employee) 
LEFT JOIN Query2 ON Employees.EmployeeNum = Query2.Employee;

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论