Obecnie mam tych tabel:SQL Dołącz na najbliższym dostępnym terminie
CREATE TABLE #SECURITY_TEMP (ID CHAR(30))
CREATE TABLE #SECURITY_TEMP_PRICE_HISTORY (ID CHAR(30), PRICEDATE DATE, PRICE FLOAT)
CREATE TABLE #SECURITY_POST (ID CHAR(30), SECPOS int)
INSERT INTO #SECURITY_TEMP (ID) VALUES ('APPL') ,('VOD'),('VOW3'), ('AAA')
INSERT INTO #SECURITY_TEMP_PRICE_HISTORY (ID,PRICEDATE, PRICE) VALUES
('APPL', '20150101',10.4), ('APPL', '20150116',15.4), ('APPL', '20150124',22.4),
('VOD', '20150101', 30.5), ('VOD', '20150116',16.5), ('VOD', '20150124',16.5),
('VOW3', '20150101', 45.5), ('VOW3', '20150116',48.8) ,('VOW3', '20150124',50.55),
('AAA', '20100118', 0.002)
INSERT INTO #SECURITY_POST (ID,SECPOS) VALUES ('APPL', 100), ('VOD', 350), ('VOW3', 400)
chcę mieć czyste tabelę, która pokazuje mi identyfikator zabezpieczeń, położenie bezpieczeństwa i najnowszą dostępną cenę tego zabezpieczenia, gdy data jest przekazywane.
Teraz, kiedy należy wykonać następujące czynności:
SELECT sec.ID, sec.SECPOS, t.PRICE
FROM #SECURITY_POST as SEC INNER JOIN #SECURITY_TEMP_PRICE_HISTORY as t
ON sec.ID = t.ID
WHERE t.PriceDate = '20150101'
GROUP BY sec.ID, secPos, t.price
uzyskać poprawny wynik
1. ID SECPOS PRICE
2. APPL 100 10.4
3. VOD 350 30.5
4. VOW3 400 45.5
Jednakże mogą być indywidualne okoliczności, w których cena zapasów nie jest dostępna. W związku z tym chciałbym móc uzyskać najnowszą dostępną cenę.
Doing
SELECT sec.ID, sec.SECPOS, t.PRICE
FROM #SECURITY_POST as SEC INNER JOIN
#SECURITY_TEMP_PRICE_HISTORY as t
ON sec.ID = t.ID
WHERE t.PriceDate = '20150117'
GROUP BY sec.ID, secPos, t.price
zwraca 0 wierszy z powodu braku danych, a robi
SELECT sec.ID, sec.SECPOS, t.PRICE
FROM #SECURITY_POST as SEC INNER JOIN
#SECURITY_TEMP_PRICE_HISTORY as t
ON sec.ID = t.ID
WHERE t.PriceDate <= '20150117'
GROUP BY sec.ID, sec.secPos, t.price
HAVING sec.secpos <> 0
Returns powielać wiersze.
Próbowałem mnóstwo różnych metodologii i po prostu nie mogę uzyskać wyjścia, które chcę. Co więcej, chciałbym również móc uzyskać jedną kolumnę z ceną najbliższą danej dacie (nazwać ją START_DATE
) i jedną kolumnę z ceną najbliższą drugiej dacie (pod to END_DATE
) i jedną kolumną, która ma być pozycją [email protected]_DATE - [email protected]_DATE
. Cena jest zawsze pobierana z tego samego #SECURITY_TEMP_PRICE_HISTORY
.
Jednak moja wiedza SQL jest po prostu kłopotliwa i nie mogłem wymyślić na nią skutecznego sposobu. Każda pomoc będzie doceniona. Należy również pamiętać, że tabela #SECURITY_PRICE_HISTORY table may contain more securities than the #SECURITY_POST
.
Dziękuję wszystkim za oczyszczenie mojego posta! – buellboy