繁体   English   中英

根据下一条记录访问SQL子查询条件

[英]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中,您有两个函数来实现此查询LAGLEAD ,即上一行和下一行,您可以在此处查看教程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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM