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

piah890a  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(607)

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

  1. SELECT DISTINCT
  2. 1.Client
  3. 1.ID
  4. 1.Thing
  5. 1.Status
  6. MIN(1.StatusDate) as 'statdate'
  7. FROM
  8. SAMPLE 1
  9. WHERE
  10. []
  11. GROUP BY
  12. 1.Client
  13. 1.ID
  14. 1.Thing
  15. 1.status

我的输出如下

  1. Client Id Thing Status Statdate
  2. CompanyA 123 Thing1 Approved 12/9/2019
  3. CompanyA 123 Thing1 Denied 12/6/2019

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

ua4mk5z4

ua4mk5z41#

使用窗口功能:

  1. SELECT s.*
  2. FROM (SELECT s.*,
  3. ROW_NUMBER() OVER (PARTITION BY id ORDER BY statdate) as seqnum
  4. FROM SAMPLE s
  5. WHERE []
  6. ) s
  7. WHERE seqnum = 1;

这将返回每个id的第一行。

l5tcr1uw

l5tcr1uw2#

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

  1. SELECT
  2. *
  3. FROM
  4. (
  5. SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY statusdate) as rn
  6. FROM sample
  7. WHERE ...
  8. ) x
  9. WHERE rn = 1

其工作方式是按statusdate的顺序对所有行进行顺序编号,每次id更改时都从1重新开始编号。如果你这样收集了所有的数字1,你就有了你的“第一个记录”
或者可以协调一个最小值:

  1. SELECT
  2. *
  3. FROM
  4. sample s
  5. INNER JOIN
  6. (SELECT ID, MIN(statusDate) as minDate FROM sample WHERE ... GROUP BY ID) mins
  7. ON s.ID = mins.ID and s.StatusDate = mins.MinDate
  8. WHERE
  9. ...

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

展开查看全部

相关问题