моя таблица имеет несколько записей, который имеет тот же MemberID., я хочу закончиться только одна запись.
select DISTINCT(MemberID) from AnnualFees;
затем результат прибудет. но я хочу показать другие данные столбца также, но когда я делаю это
select DISTINCT(MemberID),StartingDate,ExpiryDate,Amount from AnnualFees;
все подробности включая те же данные MemberID, также отображающиеся.
может кто-то помогать мне.
Предполагая, что вам просто нужна произвольная строка для каждого идентификатора члена, вы можете сделать это:
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;
не знаю, достаточно ли это то, что вам нужно, но вам может потребоваться посмотреть 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
/
Вам нужно выбрать, какую из строк с дублирующимися идентификаторами членов вернуть тем или иным способом. В результате будет получена строка с наибольшей начальной датой.
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)
select DISTINCT MemberID,StartingDate,ExpiryDate,Amount from AnnualFees;
remove paranthesis