- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想从表 1 中选择最新日期、第二个最新日期和第一个日期,其中第一个日期高于另一个表 2 中的引用日期。并且该引用日期也应该是该表 2 中的最新日期。我有一个解决方案,应该是。但问题是,如果表 1 中只有 1 条记录,解决方案将不会返回输出。表格示例:
表 1
Reg ID | DateOfAI | byTechnician
2GP001 | 2015-01-13 | 31
2GP001 | 2015-02-18 | 31
2GP001 | 2017-11-10 | 45
2GP001 | 2017-11-30 | 32
2GP044 | 2017-11-30 | 28
2GP001 | 2017-12-23 | 32
表2
Reg ID | DateOfCalving | DryOffDate
2GP001 | 2016-01-14 |
2GP070 | 2016-01-14 |
2GP065 | 2017-04-08 |
2GP001 | 2017-04-12 |
我的预期输出是:
Reg ID | LatestDateOfCalving | 1stDateOfAI | PreviousAIDate | LastestAIDate
2GP001 | 2017-04-12 | 2017-11-10 | 2017-11-30 | 2017-12-23
我从月球来回四处搜索……仍然没有运气。这些是我用过的查询
第一个:
SELECT b.actualDam,COUNT(x.actualDam) AS ilanba, max(b.breedDate) AS huli, max(x.breedDate) AS nex,MIN(x.breedDate) AS una,IFNULL(c.calvingDate,NULL) AS nganak,r.*,h.herdID,a.animalID,a.regID, IFNULL(a.dateOfBirth,NULL) AS buho
FROM x_animal_breeding_rec b
LEFT JOIN x_animal_calving_rec c ON b.recID=c.brecID
LEFT JOIN x_herd_animal_rel r ON b.actualDam=r.animal
LEFT JOIN x_herd h ON r.herd=h.herdID
LEFT JOIN x_animal_main_info a ON b.actualDam=a.animalID
JOIN x_animal_breeding_rec x ON b.actualDam = x.actualDam AND x.breedDate < b.breedDate
WHERE h.herdID = ? AND x.mateType = ? AND x.recFlag = ? GROUP BY b.actualDam
我试过的第二个是这段代码:
SELECT b.recID
, b.actualDam
, b.breedDate
, min(b.breedDate) AS una
, max(b.breedDate) AS huli
, COUNT(b.actualDam) AS sundot
, b.mateType
, b.recFlag
, a.animalID
, a.regID
, h.*
FROM
( SELECT c.recID, c.actualDam
, c.breedDate
, c.mateType
, c.recFlag
, CASE WHEN @prev=c.recID THEN @i:=@i+1 ELSE @i:=1 END i
, @prev:=c.recID prev
FROM x_animal_breeding_rec c
, ( SELECT @prev:=null,@i:=0 ) vars
ORDER BY c.recID,c.breedDate DESC
) b
LEFT JOIN x_animal_main_info a ON b.actualDam=a.animalID
LEFT JOIN x_herd_animal_rel h ON b.actualDam=h.animal
WHERE i <= 2 GROUP BY b.actualDam HAVING h.herd = ? AND b.mateType = ? AND b.recFlag = ? ORDER BY b.breedDate DESC
这里的另一个问题是第一个解决方案返回错误计数。第二个解决方案返回正确的计数,但是返回了错误的日期。我希望你能给我一个主意。提前致谢。
最佳答案
以下查询回答了您的问题:
SELECT
RegID,
LatestDateOfCalving,
MIN(DateOfAI) AS 1stDateOfAI,
REPLACE(SUBSTRING_INDEX(GROUP_CONCAT(DateOfAI ORDER BY DateOfAI DESC), ',', 2), CONCAT(MAX(DateOfAI), ','), '') AS PreviousAIDate,
MAX(DateOfAI) AS LatestAIDate
FROM (
SELECT
t1.RegID,
LatestDateOfCalving,
DateOfAI,
IF(DateOfAI >= LatestDateOfCalving, 1, 0) AS dates
FROM table1 AS t1
INNER JOIN (
SELECT
RegID,
MAX(DateOfCalving) AS LatestDateOfCalving
FROM table2 GROUP BY RegID
) AS tt2 ON t1.RegID = tt2.RegID) AS x
WHERE dates = 1
GROUP BY RegID
HAVING COUNT(dates) >= 3;
输出:
+--------+---------------------+-------------+----------------+--------------+
| RegID | LatestDateOfCalving | 1stDateOfAI | PreviousAIDate | LatestAIDate |
+--------+---------------------+-------------+----------------+--------------+
| 2GP001 | 2017-04-12 | 2017-11-10 | 2017-11-30 | 2017-12-23 |
+--------+---------------------+-------------+----------------+--------------+
在子查询中,我们从 table2
中选择 RegID
和 LatestDateOfCalving
以获得引用日期。然后将其加入 table1
并标记记录 DateOfAI
是否大于或等于 LatestDateOfCalving
(IF(DateOfAI >= LatestDateOfCalving, 1, 0)
)。我们在外部查询中使用此子查询(SELECT RegID, LatestDateOfCalving, MIN(DateOfAI) AS 1stDateOfAI, MAX(DateOfAI) AS LatestAIDate, ...
)并仅选择那些包含DateOfAI 的记录
在 LatestDateOfCalving
或之后(WHERE dates = 1
,其中 1 是条件为真的标志)并且至少有 3 条记录(有计数(日期)>= 3
)。在外部查询中,我使用 REPLACE(SUBSTRING_INDEX(GROUP_CONCAT(...)))
结构从逗号 (,
) 分隔的日期列表。
关于mysql - 如何在第一个日期高于引用日期的情况下选择第一个日期、上一个日期、最晚日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48341657/
我正在使用ScheduledExecutorService使用 scheduleAtFixedRate 方法每小时提供一次数据库更新。问题是它逐渐变得更晚 - 在长期服务中我一直在记录它并且每天大约一
我有一个连接到 UILabel 的 UIDatePicker。我希望用户选择 18 年前的生日(年龄限制)。所以我用这一行来设置 maximumDate 值: datePicker.maximumDa
当我重新启动设备时,我收到 BOOT_COMPLETED广播比其他应用程序慢得多(大约 10-15 秒后)。 我看过this .但我不认为这是完全正确的。我如何(我认为)证明它是错误的: (让我们将
我有一个从 DatePickerDialog 的 onDateSetListener 调用的 TimePickerDialog,以便允许用户依次选择日期和时间。我将信息存储在日历对象 calendar
我需要查找客户是否在上一年和下一年进行了订阅,以及下一年有多少订阅是新的或被取消的。 示例数据: 身份证订阅年份120101201112019220112201232010 考虑这种方法:在订阅年份中
我必须编写一个 JavaScript 函数来检查两个日期(格式为 dd/MM/yyyy)的时间间隔是否最多为 3 个月。 我可以从两个文本框中检索两个值(无需检查格式,我已经获得了一个可以自动正确设置
我有一个输入框,类型为“时间”。我想将迟到时间 (23:00pm) 作为最小值,将早期时间 (6:00am) 作为最大值 - 创建一个 23pm - 6am 的范围。 (即中午 11 点、中午 12
我是一名优秀的程序员,十分优秀!