मेरे पास दो टेबल हैं

Table A
pk name   a_date
1  Peter  01-01-1991
2  Paul   02-01-1991
3  John   03-01-1991

Table B
pk  b_date
A   01-01-1991
B   02-01-1991

मैं जो चाहता हूं वह परिणाम है:

name   a_date        b_date
Paul   02-01-1991    01-01-1991
John   03-01-1991    02-01-1991

तालिका ए के लिए तालिका बी की निकटतम छोटी तिथि का चयन करें

मैंने चयन करने से पहले परिणाम खींचने की कोशिश की

1  Peter  01-01-1991  A  01-01-1991
1  Peter  01-01-1991  B  02-01-1991
2  Paul   02-01-1991  A  01-01-1991
2  Paul   02-01-1991  B  02-01-1991
3  John   03-01-1991  A  01-01-1991
3  John   03-01-1991  B  02-01-1991

तब मैंने ए, बी से चयन करने की कोशिश की जहां a_date>b_date

लेकिन यह इस तरह वापस आ जाएगा:

2  Paul   02-01-1991  A  01-01-1991
3  John   03-01-1991  A  01-01-1991
3  John   03-01-1991  B  02-01-1991

मैंने उप-क्वेरी जैसी कुछ चीज़ों की भी कोशिश की: जहां a_date = (चुनें...); लेकिन मुझे लगता है कि यह गलत तरीका है। तो मुझे लगता है कि अलग हो सकता है इस समस्या को हल कर सकता है, लेकिन मुझे लगता है कि मैं इस मामले में विशिष्ट का उपयोग नहीं कर सकता।

-1
Ray 15 फरवरी 2019, 13:03

2 जवाब

सबसे बढ़िया उत्तर

इसे यह करना चाहिए (यह मानता है कि तिथियां date के रूप में संग्रहीत हैं न कि तार के रूप में):

SELECT a.name, a.date, MAX(b.date)
FROM a
JOIN b ON b.date < a.date
GROUP BY a.name, a.date
0
Salman A 15 फरवरी 2019, 14:50

MySql 7.x में आप एक उप-क्वेरी में शामिल हो सकते हैं जो निकटतम की गणना करती है।

SELECT
a.*, 
b.pk as b_pk, 
b.b_date
FROM TableA a
INNER JOIN
(
    SELECT 
     a2.pk as a_pk, 
     MAX(b2.pk) AS b_pk
    FROM TableA a2
    JOIN TableB b2 ON b2.b_date < a2.a_date
    GROUP BY a2.pk
) q ON q.a_pk = a.pk
LEFT JOIN TableB b ON b.pk = q.b_pk

rextester यहां पर एक परीक्षण

MySQL 8 में आप इसके लिए विंडो फ़ंक्शन का उपयोग कर सकते हैं।

SELECT pk, name, a_date, b_pk, b_date
FROM 
(
    SELECT a.*, 
     b.pk AS b_pk,
     b.b_date,
     ROW_NUMBER() OVER (PARTITION BY a.pk ORDER BY b.b_date DESC) AS rn
    FROM TableA a
    JOIN TableB b ON b.b_date < a.a_date
) q
WHERE rn = 1

db-fiddle यहां पर एक परीक्षण

0
LukStorms 15 फरवरी 2019, 17:25