【问题标题】:Filter out entries that don't have the latest date within their subcategory过滤掉子类别中没有最新日期的条目
【发布时间】:2018-01-26 17:56:26
【问题描述】:

我用的是Ms access 2010,我的数据如下:

PROJECT(主要是单词),其中有很多:

REQUESTS(多为 1 到 20 左右的数字,不一定按顺序排列,有些注册为“1 和 2”为例),每个请求都有很多:

NEGOTIATIONS(日期)或更准确地说是“协商结束日期”,它们不按时间顺序排列。

我需要的是按照原始顺序保存数据,但不是协商中最晚日期的条目除外。

我有什么:

id | PROJECT NAME| REQUEST| DATE  
1 ----- bla ------- 3 ----- 1-2-17  
2 ----- bla ------- 3 ----- 4-2-17  
3 ----- bla ------- 3 ----- 2-2-17  
4 ----- bla ------- 5 ----- 4-2-17  
5 ----- bla ------- 5 ----- 6-2-17  
6 ----- ble ------- 1 ----- 6-2-17 
7 ----- ble ------- 1 ----- 9-2-17  
8 ----- ble ------- 3 ----- 5-3-17 
9 ----- ble ------- 3 ----- 6-3-17  
10 ---- ble ------- 3 ----- 5-3-17 

我需要什么:

id | PROJECT NAME| REQUEST| DATE 
2 ----- bla -------- 3 ---- 4-2-17  
5 ----- bla -------- 5 ---- 6-2-17  
7 ----- ble -------- 1 ---- 9-2-17  
9 ----- ble -------- 3 ---- 6-3-17 

我不知道从哪里开始。

【问题讨论】:

  • 请提供样本数据和预期结果。
  • 完成。实际上,我正在编辑它。
  • request 是否总是连续值?是否可以跳过一个值,例如:1,2,4
  • 是的。事实上,大多数条目都以 1 以外的数字开头,并且值会跳过。
  • 其实我完全不明白预期的结果。哪些条目是其谈判中的最新日期?

标签: sql database ms-access ms-access-2010


【解决方案1】:
declare @example as table (
    ExampleID int identity(1,1) not null primary key clustered
,   ProjectName nvarchar(3) not null
,   Request int not null
,   Date_ date not null
);

insert into @example (ProjectName, Request, Date_)


select 'bla', 3, eomonth(sysdatetime(), -7) union all
select 'bla', 3, eomonth(sysdatetime(), -3) union all
select 'bla', 3, eomonth(sysdatetime(), -4) union all
select 'bla', 5, eomonth(sysdatetime(), -7) union all
select 'bla', 5, eomonth(sysdatetime(), -6) union all
select 'ble', 1, eomonth(sysdatetime(), -6) union all
select 'ble', 1, eomonth(sysdatetime(), -5) union all
select 'ble', 3, eomonth(sysdatetime(), -2) union all
select 'ble', 3, eomonth(sysdatetime(), -1) union all
select 'ble', 3, eomonth(sysdatetime(), -2);

;with cte as (
    select ProjectName  
         , Request
         , max(date_) over(partition by projectname, request order by projectName, Request ) Date_
      from @example 
            )

select distinct ExampleID
     , a.ProjectName
     , a.Request
     , a.Date_
  from @example a
  join cte b
    on a.Date_ = b.Date_
   and a.ProjectName = b.ProjectName
   and a.Request = b.Request

以前的问答

您的逻辑或数据存在根本问题。

在你的例子中:

id | PROJECT NAME| REQUEST| DATE  
1 ----- bla ------- 1 ----- 1-2-17  
2 ----- bla ------- 2 ----- 4-2-17  
3 ----- bla ------- 3 ----- 2-2-17 

解决方案将解析 ID,该 ID 假设您的代理键按时间顺序排列,与日期相反,并根据项目名称排除日期小于先前记录的前一个日期的情况。 (时间顺序并不意味着它是连续的)

当您遇到以下情况时,逻辑就会崩溃:

id | PROJECT NAME| REQUEST| DATE  
1 ----- bla ------- 1 ----- 1-2-17  
2 ----- bla ------- 2 ----- 4-2-17  
3 ----- bla ------- 3 ----- 2-2-17
4 ----- bla ------- 6 ----- 6-2-17

现在你应该期待如下:

id | PROJECT NAME| REQUEST| DATE 
4 ----- bla -------- 6 ---- 6-2-17  

这是一个可接受的结果集吗?

【讨论】:

  • 结果实际上应该是条目1、2、3和4。因为它们都来自不同的请求。
  • 如果你不知道,我最近更正了例子,非常糟糕。
  • 那么项目并不重要,因为请求会显示分组
  • OP 标记为 MS Access 而不是 SQL Server。
【解决方案2】:

考虑将单元级查询与聚合查询相结合,返回等于 MaxDate 的行:

SELECT n.ID, p.[PROJECT NAME], r.[REQUEST], n.[DATE]
FROM ((PROJECTS p
INNER JOIN REQUESTS r ON p.ProjectID = r.ProjectID)
INNER JOIN NEGOTIATIONS n ON r.RequestID = n.RequestID)

INNER JOIN
   (SELECT p.[PROJECT NAME], r.[REQUEST], MAX(n.[DATE]) AS MAX_DATE
    FROM ((PROJECTS p
    INNER JOIN REQUESTS r ON p.ProjectID = r.ProjectID)
    INNER JOIN NEGOTIATIONS n ON r.RequestID = n.RequestID)
    GROUP BY p.[PROJECT NAME], r.[REQUEST]
   ) AA aggdf

ON p.[PROJECT NAME] = aggdf.[PROJECT NAME]
AND r.[REQUEST] = aggdf.[REQUEST]
AND n.[DATE] = aggdf.MAX_DATE

ORDER BY n.ID, p.[PROJECT NAME], r.[REQUEST], n.[DATE]

【讨论】:

  • OP,您在使用此解决方案时遇到了什么错误或不良结果?
猜你喜欢
  • 2014-06-26
  • 2015-01-21
  • 2017-06-27
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多