这将是简化的模式:
CREATE TABLE Participant
(`id` int, `Name` varchar(7))
;
CREATE TABLE Term
(`id` int, `participant_id` int, `start_date` date, `end_date` date)
;
INSERT INTO Participant
(`id`, `Name`)
VALUES
(1, 'Mike'),
(2, 'John'),
(3, 'Peter')
;
INSERT INTO Term
(`id`, `participant_id`,`start_date`, `end_date`)
VALUES
(1, '1', '2016-10-04', '2016-12-04'),
(2, '1', '2016-05-04', '2016-07-04'),
(3, '1', '2016-03-04', '2016-05-04')
然后我的查询就像这样
Select Participant.name, Term.id, Term.start_date, Term.end_date
from Term
inner join Participant where Term.participant_id = Participant.id;
对于一位参与者,我只需要为最低ID术语start_date和最高ID术语end_date添加一个区域。
然后它应该看起来像:
Name Term.ID Term.Start_date Term.End_date Difference(days)*
Mike 1 2016-10-04 2016-12-04 154
Mike 2 2016-05-04 2016-07-04 154
Mike 3 2016-03-04 2016-05-04 154
*这是来自一个参与者的最低ID术语start_date和最高ID术语end_date之间的差异。并且每次为每个参与者显示相同的内容
因此,2016-10-04(ID 1 start_date)与2016-05-04(ID 3 end_date)之间存在差异。所以它将从10月到5月。这将产生154天的差异,或者-154,因为它会倒退。
我无法弄清楚逻辑是什么逻辑。如何在查询中找出该参与者条款中最高和最低ID项。
这是我到目前为止的地方:
SELECT
participant.user_id,
participant.name,
term.term_id,
term.start_date,
term.end_date
/*DATEDIFF(MAX(term.pt_prgm_term_insur_start_date),MIN(term.pt_prgm_term_insur_end_date)) x */
FROM pt participant
JOIN prgm_term term on participant.user_id = term.user_id
这是它的结果:
user_id user_name term_id start_date end_date difference
29415 Yi 143770 2004-12-15 2005-06-13 563
29415 Yi 143771 2005-06-14 2005-12-17 563
29417 Guillermo 143772 2004-11-08 2005-07-07 ?
29418 Raul 143773 2004-11-08 2005-07-07 ?
29419 Volker 143774 2005-01-03 2005-08-01 ?
29420 Tomas 143775 2004-11-15 2006-06-13 ?
29415 Yi 143776 2005-12-18 2006-06-30 563
29422 Hulda 143777 2004-11-15 2006-06-13 ?
29424 Jan 143778 2004-11-15 2005-03-16 ?
29425 Catherine 143779 2004-12-01 2006-07-01 ?
所以如果我以易建联为例。 Yi有3个条款,ID为143770,143771和143776.所以我必须从143770(2004-12-15)捕获start_date,结束日期从143776(2006-06-30),计算天差并将其显示在"差异"所有易的所有条款的专栏。差异将是563天。
使用@strawberry提示我得到了这个
user_id user_name term_id start_date end_date difference
1 Peter 155857 2003-10-01 2004-04-30 -212
16 Mika 155861 1997-11-01 1998-11-30 -394
17 Masayuki 155862 1997-11-01 1997-11-30 -29
18 Kazuko 155863 1997-11-01 1997-11-30 -29
418 Tobias 155915 1997-03-01 1997-09-30 -213
419 Dirk 155916 1997-03-01 1997-09-30 -213
420 Markus 155917 1998-03-01 1997-09-30 152
421 Ruth 155918 1997-03-01 1997-09-30 -213
422 Anne-Kathrin 155919 1997-03-01 1997-09-30 -213
423 Tobias 155920 1997-03-01 1997-09-30 -213
使用此查询
SELECT
participant.user_id,
participant.name,
term.term_id,
term.start_date,
term.end_date,
DATEDIFF(MIN(term.start_date),MAX(term.end_date)) x
FROM pt participant
JOIN pt_prgm_term term on participant.user_id = term.user_id
group by user_id
差异是完美的,只有每个参与者显示一行(因为分组),而我需要显示所有术语并重现每个术语的差异。如果我按term_id分组,那么差异是在每个术语中计算的,而不是之前的计算方式(在最高和最低Id术语之间)
这应该是
user_id user_name term_id start_date end_date difference
1 Peter 155857 2003-10-01 2004-04-30 -212
1 Peter 155861 1997-11-01 1998-11-30 -212
17 Masayuki 155862 1997-11-01 1997-11-30 -29
18 Kazuko 155863 1997-11-01 1997-11-30 -29
418 Rafael 155915 1997-03-01 1997-09-30 -220
419 Dirk 155916 1997-03-01 1997-09-30 -210
420 Markus 155917 1998-03-01 1997-09-30 -213
420 Markus 155918 1997-03-01 1997-09-30 -213
420 Markus 155919 1997-03-01 1997-09-30 -213
423 Tobias 155920 1997-03-01 1997-09-30 -229
彼得和马库斯将成为例子
答案 0 :(得分:1)
最后我找到了答案。非常感谢@Strawberry为我指路。
我必须在select语句中创建一个子查询才能获得正确的信息。
最后的查询是:
SELECT
participant.user_id as participant_ID,
participant.name,
term.term_id,
term.start_date,
term.end_date,
(select
DATEDIFF(MIN(term.start_date),MAX(term.end_date))
from
pt participant
join
pt_prgm_term term on participant.user_id = term.user_id
WHERE participant.user_id = participant_ID
GROUP BY participant.user_id ) as difference
FROM pt participant
JOIN pt_prgm_term term on participant.user_id = term.user_id
答案 1 :(得分:0)
SELECT DATEDIFF(MAX(start_date),MIN(end_date)) x FROM term;