我需要从Inventory Transaction表中返回Item Master表中每个Item#的第一个和最后一个库存事务处理日期.我需要最后的日期来显示最近是否有任何类型的活动,但我需要第一个日期的目的,以显示何时创建的部分.有一个交易代码的描述,这=‘新项目’,所以我想筛选最小日期汇总的代码,但我不想要任何最大日期汇总的过滤器.TRANSACTION表有数百万行.

有没有比只有两个CTE子查询更有效的方法来实现这一点呢?

WITH MinDate AS(
SELECT
PartID
,MIN(TransDate) AS 'MinTrans'
FROM Translog
WHERE TransDesc = 'NEW ITEM'
GROUP BY PartID),
MaxDate AS(
SELECT
PartID
,MAX(TransDate) AS 'MaxTrans'
FROM Translog
GROUP BY PartID)

SELECT
PartID
,MinTrans
,MaxTrans
FROM ItemTab
LEFT JOIN MinDate 
ON MinDate.PartID = ItemTab.PartID
LEFT JOIN MaxDate
ON MaxDate.PartID = ItemTab.PartID

推荐答案

它被称为Conditional Aggregation.请注意min()中的CASE表达式

Example

Select  PartID
       ,MinTrans = min( case when TransDesc = 'NEW ITEM' then TransDate end)
       ,MaxTrans = max( TransDate )
From  Translog
Group By  PartID

Sql相关问答推荐

需要解决办法通过传递过程参数而不是声明表行类型来声明表类型

如何从多行数据中获取一行合并数据?

Postgres:对包含数字的字符串列表进行排序

如何使用WSO2将空值传递给我的SQL Server存储过程?

如何隐藏聚合JSON数组元素的键

从数据库中查找总和大于或等于查询中的数字的数字

查询页面推荐

在 Postgres 中将结果按几十年划分

每个分组最多 Select 最后 2 个值并并排显示它们

GRAFANA 数据库查询错误:pq:列名称不存在

在 SQL Server 中合并两个 XML 列

正则表达式忽略特定数据部分的分隔符

如何显示最常引用条目的详细信息

为重复的项目编号显示正在处理

在 PostgreSQL 中使用重音敏感排序进行重音不敏感搜索

如果 SQL 中不存在数据,如何根据某个 ID 为所有日期添加前一行

如何在 PL/SQL 中区分返回的 XML 值?

SQL 查询以填充单个列中的所有值

使用一组值进行分组和计数

postgreSQL 中的循环表