Как Выбрать только одну уникальную запись из Таблицы, использующей Отличный

моя таблица имеет несколько записей, который имеет тот же MemberID., я хочу закончиться только одна запись.

select DISTINCT(MemberID)  from AnnualFees;

затем результат прибудет. но я хочу показать другие данные столбца также, но когда я делаю это

select DISTINCT(MemberID),StartingDate,ExpiryDate,Amount  from AnnualFees;

все подробности включая те же данные MemberID, также отображающиеся.

может кто-то помогать мне.

7
задан Martin Smith 25 June 2010 в 10:28
поделиться

4 ответа

Предполагая, что вам просто нужна произвольная строка для каждого идентификатора члена, вы можете сделать это:

select memberid, this, that, theother
from
(
select memberid, this, that, theother,
       row_number() over (partition by memberid order by this) rn
from   annualfees
)
where rn = 1;

Если вам нужна определенная строка для каждого идентификатора члена, например тот, у которого самая последняя дата начала, тогда вы можете изменить его на:

select memberid, this, that, theother
from
(
select memberid, this, that, theother,
       row_number() over (partition by memberid order by StartDate desc) rn
from   annualfees
)
where rn = 1;
20
ответ дан 6 December 2019 в 06:49
поделиться

не знаю, достаточно ли это то, что вам нужно, но вам может потребоваться посмотреть GROUP BY вместо DISTINCT ...

если у вас есть несколько записей с одним и тем же идентификатором участника, вам может потребоваться указать exaclty как отличить ту, которую вы хотите, от других

например, чтобы получить дату последнего начала каждого члена:

SELECT memberid, max(startingdate)
FROM annualfees
GROUP BY memberid

но если вам нужно идентифицировать одну запись таким способом, но также отобразить другие столбцы, я думаю вам может понадобиться проделать подобный трюк ...

например, подзапросить указанный выше SELECT с соединением, чтобы присоединиться к другим столбцам, которые вы хотите:

SELECT subq.memid, subq.startdate, a.expirydate, a.amount
FROM (
  SELECT memberid AS memid, max(startingdate) AS startdate
  FROM annualfees
  GROUP BY memberid ) subq
INNER JOIN annualfees a ON a.memberid = subq.memid 
               AND a.startingdate = subq.startdate

от начала до конца, также с отображением таблицы данных (o / p было отслежено / получено с помощью "SET VERIFY ON") ...

-- show all rows
select *
from annualfees
order by memberid, startingdate
MEMBERID               STARTINGDATE              EXPIRYDATE           AMOUNT               
---------------------- ------------------------- -------------------- -------------------- 
1                      02-DEC-09                 05-FEB-10            111                  
1                      25-JUN-10                 25-JUN-11            222                  
2                      25-APR-10                 25-JUN-13            333                  

3 rows selected

/
-- show one member`s data using max(startingdate) as selector.
SELECT memberid, max(startingdate)
    FROM annualfees
    GROUP BY memberid
MEMBERID               MAX(STARTINGDATE)         
---------------------- ------------------------- 
1                      25-JUN-10                 
2                      25-APR-10                 

2 rows selected

/ 
-- show above data joined with the other columns.
SELECT subq.memid, subq.startdate, a.expirydate, a.amount
    FROM (
      SELECT memberid AS memid, max(startingdate) AS startdate
      FROM annualfees
      GROUP BY memberid ) subq
    INNER JOIN annualfees a ON a.memberid = subq.memid AND a.startingdate = subq.startdate
MEMID                  STARTDATE                 EXPIRYDATE           AMOUNT               
---------------------- ------------------------- -------------------- -------------------- 
1                      25-JUN-10                 25-JUN-11            222                  
2                      25-APR-10                 25-JUN-13            333                  

2 rows selected

/
6
ответ дан 6 December 2019 в 06:49
поделиться

Вам нужно выбрать, какую из строк с дублирующимися идентификаторами членов вернуть тем или иным способом. В результате будет получена строка с наибольшей начальной датой.

SELECT MemberID,StartingDate,ExpiryDate,Amount 
FROM AnnualFees af
WHERE NOT EXISTS (
        SELECT * from AnnualFees af2 
        WHERE af2.MemberID = af.MemberID 
        AND af2.StartingDate > af.StartingDate)
3
ответ дан 6 December 2019 в 06:49
поделиться

select DISTINCT MemberID,StartingDate,ExpiryDate,Amount from AnnualFees;

remove paranthesis

-3
ответ дан 6 December 2019 в 06:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: