需要在mysql中为同一表中另一列的最小值查找一列的值的逻辑

需要在mysql中为同一表中另一列的最小值查找一列的值的逻辑,mysql,database,date,greatest-n-per-group,window-functions,Mysql,Database,Date,Greatest N Per Group,Window Functions,我写了下面的代码来得到这样的结果 SELECT `temp2`.`UserId` AS `UserId`, `temp2`.`ScheduleDate` AS `ScheduleDate`, `temp2`.`daystodue` FROM ( SELECT `temp1`.`UserId` AS `UserId`, `temp1`.`ScheduleDate` AS `ScheduleDate`, `

我写了下面的代码来得到这样的结果

SELECT `temp2`.`UserId` AS `UserId`,
              `temp2`.`ScheduleDate` AS `ScheduleDate`,
             `temp2`.`daystodue`
  FROM (
SELECT
      `temp1`.`UserId` AS `UserId`,
      `temp1`.`ScheduleDate` AS `ScheduleDate`,
      `temp1`.`DueDate` AS `DueDate`,
      `temp1`.`CompletedState` AS `CompletedState`,
      IF(((`temp1`.`CompletedState` = 0) AND ((`temp1`.`ScheduleDate` - CURDATE()) <= 0)), (TO_DAYS(`temp1`.`DueDate`) - TO_DAYS(CURDATE())), 0) AS `daystodue`
    FROM (SELECT
        `fd_dw`.`ComplianceFactTable`.`UserId` AS `UserId`,
        CAST(`fd_dw`.`ComplianceFactTable`.`CourseModule_ScheduleDateID` AS date) AS `ScheduleDate`,
        CAST(`fd_dw`.`ComplianceFactTable`.`CourseModule_dueDateID` AS date) AS `DueDate`,
        `fd_dw`.`ComplianceFactTable`.`CourseModuleComplete_completionstate` AS `CompletedState`
      FROM `fd_dw`.`ComplianceFactTable`
      WHERE ((`fd_dw`.`ComplianceFactTable`.`CourseModule_dueDateID` > 0)
      AND ((CAST(`fd_dw`.`ComplianceFactTable`.`CourseModule_dueDateID` AS date) - CURDATE()) > 0))) `temp1`) `temp2` 
  WHERE `temp2`.`UserId` IN (223699,223741,223780,223678,243988,380316,388737,121896,491562)
121896  2019-11-06  0
223678  2019-10-23  43
223699  2019-10-23  43
223741  2019-10-23  43
223780  2019-10-23  43
243988  2019-10-15  21
380316  2019-10-05  0
388737  2019-10-23  29
491562  2019-10-17  7
但是我想要这样的东西

SELECT `temp2`.`UserId` AS `UserId`,
              `temp2`.`ScheduleDate` AS `ScheduleDate`,
             `temp2`.`daystodue`
  FROM (
SELECT
      `temp1`.`UserId` AS `UserId`,
      `temp1`.`ScheduleDate` AS `ScheduleDate`,
      `temp1`.`DueDate` AS `DueDate`,
      `temp1`.`CompletedState` AS `CompletedState`,
      IF(((`temp1`.`CompletedState` = 0) AND ((`temp1`.`ScheduleDate` - CURDATE()) <= 0)), (TO_DAYS(`temp1`.`DueDate`) - TO_DAYS(CURDATE())), 0) AS `daystodue`
    FROM (SELECT
        `fd_dw`.`ComplianceFactTable`.`UserId` AS `UserId`,
        CAST(`fd_dw`.`ComplianceFactTable`.`CourseModule_ScheduleDateID` AS date) AS `ScheduleDate`,
        CAST(`fd_dw`.`ComplianceFactTable`.`CourseModule_dueDateID` AS date) AS `DueDate`,
        `fd_dw`.`ComplianceFactTable`.`CourseModuleComplete_completionstate` AS `CompletedState`
      FROM `fd_dw`.`ComplianceFactTable`
      WHERE ((`fd_dw`.`ComplianceFactTable`.`CourseModule_dueDateID` > 0)
      AND ((CAST(`fd_dw`.`ComplianceFactTable`.`CourseModule_dueDateID` AS date) - CURDATE()) > 0))) `temp1`) `temp2` 
  WHERE `temp2`.`UserId` IN (223699,223741,223780,223678,243988,380316,388737,121896,491562)
121896  2019-11-06  0
223678  2019-10-23  43
223699  2019-10-23  43
223741  2019-10-23  43
223780  2019-10-23  43
243988  2019-10-15  21
380316  2019-10-05  0
388737  2019-10-23  29
491562  2019-10-17  7

我知道,对于每个id,您都希望记录最短日期。当有多条记录的日期最短时,您希望记录的日期最短

在MySQL 8.0中,可以使用窗口函数:

select id, date, value
from (
    select 
        t.*,
        row_number() over(partition by id order by date, value) rn
    from mytable t
) t
where rn = 1
在早期版本中,您可以使用相关suquery进行筛选:

select id, date, min(value) value
from mytable t
where t.date = (
    select t1.date from mytable t1 where t1.id = t.id order by t1.date, t1.value limit 1
)
group by id, date
或:

在这种情况下,所有3个查询都返回:

| id     | date       | value |
| ------ | ---------- | ----- |
| 121896 | 2019-11-06 | 0     |
| 223678 | 2019-10-23 | 43    |
| 223699 | 2019-10-23 | 43    |
| 223741 | 2019-10-23 | 43    |
| 223780 | 2019-10-23 | 43    |
| 243988 | 2019-10-15 | 21    |
| 380316 | 2019-10-05 | 0     |
| 388737 | 2019-10-23 | 29    |
| 491562 | 2019-10-17 | 7     |

如果没有mysql 8,请从TableName中选择mincolumn1、mincolumn2使用相关查询

  SELECT *
  FROM yourTable t1
  WHERE date = (SELECT MIN(date)
                FROM yourTable t2
                WHERE t1.user_id = t2.user_id)

您的预期输出与问题的标题不同,因为它包含第一列中每个值的第二列日期中最小值的行。 不存在以下用途:


解释该输出的逻辑。向我们显示数据库模式、示例数据、当前和预期输出。请阅读您的mysql版本是什么?您所指的代码在哪里?从table group by Col1中选择Col1、minCol2、minCol3,逻辑是针对每个用户的,对于最小日期字段,我想要相应的值,您应该有一行id,我不确定是每个列都要min,还是只需要与min Date相关的数据我想要与min Date相关的值第三列我认为mindate更干净。谢谢Juan!!你能帮我每一张唱片只录一张吗user@Sai:如果最短日期有多条记录,您希望显示哪一条?
select t.* from tablename t
where not exists (
  select 1 from tablename
  where id = t.id and date < t.date
)