需要在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
)