如何检索每个不同 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

结尾