![](/img/trans.png)
[英]Merge Value Of Multiple Record based on similar criteria in Access/SQL/Excel
[英]Access SQL Subquery Criteria based on Next Record
我有一列QualityCheckTimes。 我还有一个与ProductionSkids的StartTimes和EndTimes不同的表。
我需要一个查询,该查询针对每个QualityCheckTime,基于其StartTimes和EndTimes的最小SkidID和最大SkidID返回。
样本数据
QCCheckTimes
12:00 AM
1:00 AM
2:00 AM
SkidID SkidStartTime SkidEndTime
1 12:05 AM 12:20 AM
2 12:21 AM 12:40 AM
3 12:41 AM 12:50 AM
4 12:51 AM 1:06 AM
预期产量:
QCCheckTimes MinSkidID MaxSkidID
12:00 AM Skid1 Skid3
1:00 AM Skid4 ...
2:00 AM ...
我已经尝试了一些方法,但是关键是我需要找到一种方法来获取两个QualityCheck时间之间所有匹配的Skid Times,而这些QualityTimes位于单独的行中。
SELECT...
WHERE [SkidStartDateTime] >= [QualitySamples_tbl].[SampleDateTime]
AND [SkidEndDateTime] < NEXT?? [QualitySamples_tbl].[SampleDateTime]);
您可以使用子查询和Hour()
函数来实现此目的。
尝试这个:
table1包含:QCCheckTimes
table2包含:SkidID,SkidStartTime,SkidEndTime
码:
SELECT table1.qcchecktimes,
Iif([minofid] IS NULL, "...", "skid" & [minofid]) AS MinSkidID,
Iif([c].[maxofid] = [b].[minofid], "...",
Iif([maxofid] IS NULL, "...", "skid" & [maxofid])) AS MaxSkidID
FROM (table1
LEFT JOIN (SELECT table1.qcchecktimes,
Min(table2.skidid) AS MinOfID
FROM table1,
table2
WHERE (( ( Hour([skidendtime]) ) = Hour([qcchecktimes]) ))
GROUP BY table1.qcchecktimes) AS b
ON table1.qcchecktimes = b.qcchecktimes)
LEFT JOIN (SELECT table1.qcchecktimes,
Max(table2.skidid) AS MaxOfid
FROM table1,
table2
WHERE (( ( Hour([skidendtime]) ) = Hour([qcchecktimes]) ))
GROUP BY table1.qcchecktimes) AS c
ON table1.qcchecktimes = c.qcchecktimes
GROUP BY table1.qcchecktimes,
Iif([minofid] IS NULL, "...", "skid" & [minofid]),
Iif([c].[maxofid] = [b].[minofid], "...",
Iif([maxofid] IS NULL, "...", "skid" & [maxofid]));
我不使用访问权限,但在SQL Server中,您有两个函数来实现此查询LAG和LEAD ,即上一行和下一行,您可以在此处查看教程http://www.c-sharpcorner.com/UploadFile/f82e9a/lag -和-铅-功能-在-SQL服务器/
因此在SQL中,您可以执行以下操作(此示例使用整数而不是时间)
----------------your single table-----------------
declare @a table(id int)
insert into @a
select 1 union
select 5 union
select 10 union
select 14 union
select 17 union
select 20
----------------table with ranges-----------------
declare @b table (start int, finish int)
insert into @b
select 1,4 union
select 2,5 union
select 5,8 union
select 10,15
----------------Aux Table--------------------------
declare @a_PlusNext table (id int, idNext int)
insert into @a_PlusNext
SELECT id,LEAD(id) OVER(ORDER BY id) nextId from @A
----------------------Final Query------------------
SELECT
*
FROM @a_PlusNext
INNER JOIN @b on start >= id and finish <= idNext
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.