从 Table 获取特定值的子查询
Subquerying To Obtain Specific Values From Table
我需要查询方面的帮助,我会尽力解释我的问题。我在下面的 11 行中有以下 table,它们是通过从 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 记录中的值时,都会创建一个新行。
从这个 table 中,我试图特别拉回 3 行(ID = #6、9 和 11 的行。)
这些是当STATUS_DESC最后一次等于'Completed'时具有最小REC_UPDT_DTTM的记录。对于 SharePoint ID = 270 的行,有一个记录是 'Completed' 但被反转为 'In Process' 然后又被放回 'Completed.' 的实例对于这条记录,它应该不要取 ID = 3 的行,它应该取 ID = 6 的行。
有没有人可以帮助我处理这段代码,因为我不知道如何继续获取我想要的行?我知道我必须使用子查询和函数,但我现在真的卡住了。
如果需要更多信息,请告诉我。
使用 MIN
和 GROUP 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]
.
此查询适用于上面的数据集。但是,如果 SHPT_ID 可以在同一天有两个 Completed 记录,那么 return 两行 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
不确定我是否理解你的问题,但由于日期格式是 mm-dd-yyyy,2-2-2019 (#3) 小于 3-1-2019 (#6)。
我需要查询方面的帮助,我会尽力解释我的问题。我在下面的 11 行中有以下 table,它们是通过从 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 记录中的值时,都会创建一个新行。
从这个 table 中,我试图特别拉回 3 行(ID = #6、9 和 11 的行。)
这些是当STATUS_DESC最后一次等于'Completed'时具有最小REC_UPDT_DTTM的记录。对于 SharePoint ID = 270 的行,有一个记录是 'Completed' 但被反转为 'In Process' 然后又被放回 'Completed.' 的实例对于这条记录,它应该不要取 ID = 3 的行,它应该取 ID = 6 的行。
有没有人可以帮助我处理这段代码,因为我不知道如何继续获取我想要的行?我知道我必须使用子查询和函数,但我现在真的卡住了。
如果需要更多信息,请告诉我。
使用 MIN
和 GROUP 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]
.
此查询适用于上面的数据集。但是,如果 SHPT_ID 可以在同一天有两个 Completed 记录,那么 return 两行 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
不确定我是否理解你的问题,但由于日期格式是 mm-dd-yyyy,2-2-2019 (#3) 小于 3-1-2019 (#6)。