【问题标题】:Subquerying To Obtain Specific Values From Table子查询从表中获取特定值
【发布时间】:2019-09-07 01:23:04
【问题描述】:

我在查询方面需要帮助,并会尽力解释我的问题。我有下面的 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 关联的最后一条记录会带来“12/31/9999”的 EXPIR_DT(到期日期)。每次更新 SharePoint ID 记录中的值时,都会创建一个新行。

从这个表中,我试图特别拉回 3 行(ID = #6、9 和 11 的行。)

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

有没有人可以帮助我处理这段代码,因为我不知道如何继续获取我想要的行?我知道我必须使用子查询和函数,但我现在真的卡住了。

如果需要更多信息,请告诉我。

【问题讨论】:

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


    【解决方案1】:

    使用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].

    【讨论】:

    • 这不会返回整行,只是数据的一个子集。 OP 要求完整的行。
    • 如果主键 ID 列表不足,您可以将其用作子查询。
    【解决方案2】:

    此查询适用于上述数据集。但是,如果一个 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
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 是的,这就是为什么我说那个特定的 Sharepoint ID..它最初是 Completed,然后从那个状态中取出。然后在“In Process”之后再次将其放入 Completed 中。
      猜你喜欢
      • 2019-08-11
      • 2020-02-20
      • 1970-01-01
      • 2021-11-27
      • 2012-04-24
      • 1970-01-01
      • 1970-01-01
      • 2018-08-27
      • 1970-01-01
      相关资源
      最近更新 更多