如何检索每个不同id的最早日期和状态

piah890a  于 2021-02-14  发布在  Java
关注(0)|答案(2)|浏览(517)

我一直在试图写一个查询来完善这个示例,但似乎做不到的把戏,因为我仍然收到重复。希望我能得到帮助如何解决这个问题。

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

因此,尽管查询是按照我的要求进行的,并显示每个状态的最小状态日期,但我只需要第一个状态日期。我有大约3万行要过滤,所以任何不运行的都会重载查询,使其无法运行。任何帮助都将不胜感激

ua4mk5z4

ua4mk5z41#

使用窗口功能:

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的第一行。

l5tcr1uw

l5tcr1uw2#

使用您觉得更舒服/更了解的选项:

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,你就有了你的“第一个记录”
或者可以协调一个最小值:

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和mindate的列表,然后将其连接回主表。因此,您可以取回在分组操作中丢失的所有数据;在一个组中不能同时“保留数据”和“丢弃数据”;如果你不仅仅按id分组,你会得到更多的组(正如你所发现的)。如果只按id分组,则会丢失其他列。没有任何方法可以说“按id分组,并获取最小日期,同时获取与最小日期相同行中的所有其他数据”,而不执行“按id分组,获取最小日期,然后将此数据集连接回主数据集以获取该最小日期的其他数据”。如果您尝试在单个分组中完成所有操作,您将失败,因为您要么必须按更多列进行分组,要么对select中的其他数据使用聚合函数,这样会混淆您的数据;当分组完成后,“来自同一行的其他数据”的概念就消失了
请注意,如果两个记录的最小日期相同,则这可能会返回重复的行。行号表单不返回重复的记录,但是如果两个记录具有相同的最小statusdate,那么您将得到哪个是随机的。要强制一个特定的,按更多的东西,这样你就可以确定哪一个会以1结束

相关问题