如何检索每个不同 ID 的最早日期和状态
How Can I Retrieve The Earliest Date and Status Per Each Distinct ID
我一直在尝试编写一个查询来完善这个实例,但似乎无法做到这一点,因为我仍然收到重复的。希望我能得到帮助来解决这个问题。
SELECT DISTINCT
1.Client
1.ID
1.Thing
1.Status
MIN(1.StatusDate) as 'statdate'
FROM
SAMPLE 1
WHERE
[]
GROUP BY
1.Client
1.ID
1.Thing
1.status
我的输出如下
Client Id Thing Status Statdate
CompanyA 123 Thing1 Approved 12/9/2019
CompanyA 123 Thing1 Denied 12/6/2019
因此,尽管查询按照我的要求进行并显示每个状态的最小状态日期,但我只想要第一个状态日期。我有大约 30,000 行要过滤,所以无论什么 运行 都不会使查询过载并且不 运行。任何帮助将不胜感激
使用window函数:
SELECT s.*
FROM (SELECT s.*,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY statdate) as seqnum
FROM SAMPLE s
WHERE []
) s
WHERE seqnum = 1;
这是每个 ID 的第一行 returns。
使用你觉得更舒服的一个table with/understand:
SELECT
*
FROM
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY statusdate) as rn
FROM sample
WHERE ...
) x
WHERE rn = 1
一种工作方式是按照 StatusDate 的顺序对所有行进行顺序编号,每次 ID 更改时从 1 重新开始编号。如果您因此将所有数字 1 收集在一起,您将拥有一组“第一条记录”
或者可以协调一个MIN:
SELECT
*
FROM
sample s
INNER JOIN
(SELECT ID, MIN(statusDate) as minDate FROM sample WHERE ... GROUP BY ID) mins
ON s.ID = mins.ID and s.StatusDate = mins.MinDate
WHERE
...
这个准备了一个包含所有 ID 和最小日期的列表,然后将其加入主 table。因此,您可以取回在分组操作期间丢失的所有数据;你不能在一个组中同时“保留数据”和“丢弃数据”;如果你分组的不仅仅是 ID,你会得到更多的组(如你所见)。如果仅按 ID 分组,则会丢失其他列。如果不执行“按 id 分组,取最小日期,然后加入这个数据集返回主数据集以获取该最小日期的其他数据”。如果您尝试在一个分组中完成所有操作,您将失败,因为您要么必须按更多列分组,要么对 SELECT 中的其他数据使用聚合函数,这会混淆您的数据;分组完成后,“同一行的其他数据”的概念就消失了
请注意,如果两条记录具有相同的最短日期,这可能会 return 重复行。 ROW_NUMBER 表单不会 return 重复记录,但如果两条记录具有相同的最小 StatusDate,那么您将随机获得哪一条。要强制一个特定的,ORDER BY more stuff 这样你就可以确定哪个会以 1
结尾
我一直在尝试编写一个查询来完善这个实例,但似乎无法做到这一点,因为我仍然收到重复的。希望我能得到帮助来解决这个问题。
SELECT DISTINCT
1.Client
1.ID
1.Thing
1.Status
MIN(1.StatusDate) as 'statdate'
FROM
SAMPLE 1
WHERE
[]
GROUP BY
1.Client
1.ID
1.Thing
1.status
我的输出如下
Client Id Thing Status Statdate
CompanyA 123 Thing1 Approved 12/9/2019
CompanyA 123 Thing1 Denied 12/6/2019
因此,尽管查询按照我的要求进行并显示每个状态的最小状态日期,但我只想要第一个状态日期。我有大约 30,000 行要过滤,所以无论什么 运行 都不会使查询过载并且不 运行。任何帮助将不胜感激
使用window函数:
SELECT s.*
FROM (SELECT s.*,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY statdate) as seqnum
FROM SAMPLE s
WHERE []
) s
WHERE seqnum = 1;
这是每个 ID 的第一行 returns。
使用你觉得更舒服的一个table with/understand:
SELECT
*
FROM
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY statusdate) as rn
FROM sample
WHERE ...
) x
WHERE rn = 1
一种工作方式是按照 StatusDate 的顺序对所有行进行顺序编号,每次 ID 更改时从 1 重新开始编号。如果您因此将所有数字 1 收集在一起,您将拥有一组“第一条记录”
或者可以协调一个MIN:
SELECT
*
FROM
sample s
INNER JOIN
(SELECT ID, MIN(statusDate) as minDate FROM sample WHERE ... GROUP BY ID) mins
ON s.ID = mins.ID and s.StatusDate = mins.MinDate
WHERE
...
这个准备了一个包含所有 ID 和最小日期的列表,然后将其加入主 table。因此,您可以取回在分组操作期间丢失的所有数据;你不能在一个组中同时“保留数据”和“丢弃数据”;如果你分组的不仅仅是 ID,你会得到更多的组(如你所见)。如果仅按 ID 分组,则会丢失其他列。如果不执行“按 id 分组,取最小日期,然后加入这个数据集返回主数据集以获取该最小日期的其他数据”。如果您尝试在一个分组中完成所有操作,您将失败,因为您要么必须按更多列分组,要么对 SELECT 中的其他数据使用聚合函数,这会混淆您的数据;分组完成后,“同一行的其他数据”的概念就消失了
请注意,如果两条记录具有相同的最短日期,这可能会 return 重复行。 ROW_NUMBER 表单不会 return 重复记录,但如果两条记录具有相同的最小 StatusDate,那么您将随机获得哪一条。要强制一个特定的,ORDER BY more stuff 这样你就可以确定哪个会以 1
结尾