子查询以从表中获取特定值

时间:2019-04-16 21:11:02

标签: sql sql-server subquery sql-server-2016 querying

我需要查询方面的帮助,并会尽力解释我的问题。下表是11行,是通过从SharePoint列表中导入值创建的。

  ID   SHPT_ID  STATUS_DESC  REC_UPDT_DTTM  REC_CRTE_DTTM   EXPIR_DT
   1    270      Active      1-18-2019     1-19-2019     1-24-2019   
   2    270      In Progress 1-23-2019     1-24-2019     2-3-2019
   3    270      Completed   2-2-2019      2-3-2019      2-19-2019
   4    270      Completed   2-18-2019     2-19-2019    2-28-2019 
   5    270      In Progress 2-27-2019     2-28-2019    3-2-2019
   6    270      Completed   3-1-2019      3-2-2019     3-6-2019
   7    270      Completed   3-5-2019      3-6-2019     12-31-9999
   8    295      Active      12-20-2018    12-21-2018   12-26-2018
   9    295      Completed   12-25-2018    12-26-2018   12-31-9999
   10   345      Active      6-7-2017      6-8-2017     6-14-2017
   11   345      Completed   6-13-2017     6-14-2017    6-22-2017
   12   345      Completed   6-21-2017     6-22-2017    12-31-9999

与特定SharePoint ID相关联的最后一条记录的EXPIR_DT(到期日期)为'12 / 31/9999'。每次更新SharePoint ID记录中的值时,都会创建一个新行。

我要从该表中特别拉回3行(ID =#6、9和11的行)

当STATUS_DESC最后一次等于“已完成”时,这些记录具有最小的REC_UPDT_DTTM。对于SharePoint ID = 270的行,有一个实例,当记录被“完成”但被反转为“处理中”,然后又被放回“已完成”。对于此记录,它不应使用ID = 3的行,而应该使用ID = 6的行。

有没有人可以帮助我使用此代码,因为我一直坚持如何继续获取所需的行?我知道我必须使用子查询和函数,但此刻我真的很困。

请让我知道是否需要更多信息。

3 个答案:

答案 0 :(得分:1)

此查询适用于上面的数据集。但是,如果一个SHPT_ID在同一天可能有两个Completed记录,则将返回该SHPT_ID的两行:

SELECT m.*
FROM MyTable m
INNER JOIN (
    SELECT Min(Rec_UPDT_DTTM) MinUpdt,
        Shpt_ID
    FROM MyTable m1
    WHERE Status_Desc = 'Completed'
       AND NOT EXISTS (
           SELECT *
           FROM MyTable m2
           WHERE m2.Shpt_ID = m1.Shpt_ID
               AND m2.REC_UPDT_DTTM > m1.REC_UPDT_DTTM
               AND m2.Status_Desc <> 'Completed'
            )
    ) filter
    ON filter.MinUpdt = m.REC_UPDT_DTTM
    AND filter.Shpt_ID = m.Shpt_ID

要在同一天处理重复的案件,代码应如下所示:

SELECT MyTable.*
FROM MyTable
INNER JOIN (
    SELECT Shpt_ID, 
        MIN(ID) as ID
    FROM MyTable m
    INNER JOIN (
        SELECT Min(Rec_UPDT_DTTM) MinUpdt,
            Shpt_ID
        FROM MyTable
        WHERE Status_Desc = 'Completed'
       AND NOT EXISTS (
           SELECT *
           FROM MyTable m2
           WHERE m2.Shpt_ID = m1.Shpt_ID
               AND m2.REC_UPDT_DTTM > m1.REC_UPDT_DTTM
               AND m2.Status_Desc <> 'Completed'
            )
        ) filter
        ON filter.MinUpdt = MyTable.REC_UPDT_DTTM
        AND filter.Shpt_ID = MyTable.Shpt_ID
    ) as IDs
    ON MyTable.ID = IDs.ID

答案 1 :(得分:0)

使用MINGROUP BY。像这样:

SELECT [ID], [SHPT_ID], [STATUS_DESC], MIN(REC_UPDT_DTTM), [REC_CRTE_DTTM], [EXPIR_DT] FROM [myTable] WHERE [STATUS_DESC] = 'Completed' GROUP BY [SHPT_ID]

答案 2 :(得分:0)

不确定我是否理解您的问题,但由于日期格式为mm-dd-yyyy,所以2-2-2019(#3)小于3-1-2019(#6)。