Получить несколько значений из подзапроса в MS Access - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть таблица (SPG) с персоной (DonorID), датами Пожертвования (DonateDate) и местом Пожертвования (Центр).Я хотел бы найти дату и место пожертвования (легко), а затем дату и место следующего пожертвования с разрывом между двумя датами.

Я использовал подзапрос SELECT, который дает мнеСледующая дата (NextDate), но я не могу тогда получить соответствующий Центр:

SELECT SPG.DonorID,
       SPG.DonateDate,
       SPG.Center AS Center1,
       (SELECT Min(DonateDate) as MinDate
          FROM SPG As A
         WHERE SPG.DonorID = A.DonorID
           AND A.DonateDate > SPG.DonateDate) AS NextDate,
       [NextDate]-[DonateDate] AS Gap
  FROM SPG
 GROUP BY SPG.DonorID, SPG.DonateDate, SPG.Center
HAVING ((((SELECT Min(DonateDate) as MinDate
             FROM SPG As A
            WHERE SPG.DonorID = A.DonorID
              AND A.DonateDate > SPG.DonateDate))<>""))
 ORDER BY SPG.DonorID, SPG.DonateDate; 

У меня есть другой запрос INNER JOIN, который дает мне Центр, но он возвращает все будущие пожертвования, а не только следующее:

SELECT A.DonorID,
       A.DonateDate,
       A.Center,
       Min(B.DonateDate) AS NextDate, 
       B.Center,
       [B].[DonateDate]-[A].[DonateDate] AS Gap
  FROM SPG AS A INNER JOIN SPG AS B ON A.DonorID = B.DonorID
 WHERE B.DonateDate > A.DonateDate
 GROUP BY A.DonorID,
          A.DonateDate,
          A.Center,
          B.Center,
          B.DonateDate-A.DonateDate;

В принципе, я не могу объединить команду Min () из подзапроса с возвратом больше, чем поле из JOIN.

(Прошу прощения за другое обозначение -много копирования и вставки пробного кода)

1 Ответ

0 голосов
/ 20 ноября 2018

Один из богов SQL здесь может знать более чистый путь, но это все, что у меня есть в настоящее время:

select 
    s1.donorid,
    s1.donatedate,
    s1.center as center1, 
    (
        select min(s2.donatedate)
        from spg s2
        where s1.donatedate < s2.donatedate and s1.donorid = s2.donorid
    ) as nextdate, 
    (
        select s2.center
        from spg s2
        where 
        s1.donorid = s2.donorid and
        s2.donatedate = 
        (
            select min(s3.donatedate)
            from spg s3
            where s1.donatedate < s3.donatedate and s1.donorid = s3.donorid
        )
    ) as center2, 
    nextdate - s1.donatedate as gap
from
    spg s1
order by
    s1.donorid,
    s1.donatedate

И если вы только после тех записей, которые имеют «следующую» дату пожертвования, возможно:

select 
    s1.donorid,
    s1.donatedate,
    s1.center as center1, 
    (
        select min(s2.donatedate)
        from spg s2
        where s1.donatedate < s2.donatedate and s1.donorid = s2.donorid
    ) as nextdate, 
    (
        select s2.center
        from spg s2
        where 
        s1.donorid = s2.donorid and
        s2.donatedate = 
        (
            select min(s3.donatedate)
            from spg s3
            where s1.donatedate < s3.donatedate and s1.donorid = s3.donorid
        )
    ) as center2, 
    nextdate - s1.donatedate as gap
from
    spg s1
where exists 
    (select 1 from spg s2 where s1.donorid = s2.donorid and s1.donatedate < s2.donatedate)
order by
    s1.donorid,
    s1.donatedate

Я слышал, вы как коррелированные подзапросы ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...