Mam do zapytania od oracle 11
db. W poniższym zapytaniu otrzymuję wszystkie najnowsze TAG_VALUE, TAG_DESC, INSERTION_DATE and PROJECT_ID
z mojej bazy danych.Wypytuj tylko wartości numeryczne najwcześniejszej możliwej daty.
SELECT *
FROM (SELECT t.tag_value,
t.tag_desc,
u.update_as_of AS INSERTION_DATE,
p.proj_id AS PROJECT_ID,
Row_number()
over(
PARTITION BY p.proj_id
ORDER BY u.update_as_of DESC) RN
FROM project p
join update u
ON p.project_id = u.project_id
join tag t
ON t.tag_id = u.tag_id
WHERE t.tag_desc LIKE 'Equity%')
WHERE rn = 1;
Jednak doszedłem po drugiej przypadków, że odpowiedź na moją prośbę (bez sortowania je według daty) może wyglądać tak:
+----------------------------------------------+
| TAG_VALUE TAG_DESC INSERTION_DATE PROJECT_ID |
+----------------------------------------------+
| null Equity 14-DEC-14 1 |
| 0 Equity 14-DEC-14 1 |
| 312 Equity 14-DEC-14 1 |
| 23343 Equity 17-DEC-11 5 |
| 1263 Equity 16-DEC-11 5 |
| null Equity 22-JÄN-14 2 |
| null Equity 11-JÄN-14 2 |
| null Equity 25-SEPT-13 2 |
| 0 Equity 20-SEPT-13 2 |
| 1234 Equity 19-SEPT-13 2 |
| 13415 Equity 18-SEPT-13 2 |
| 99999 Equity 16-OCT-10 9 |
+----------------------------------------------+
Moja Result Set
powinien wyglądać tak:
+----------------------------------------------+
| TAG_VALUE TAG_DESC INSERTION_DATE PROJECT_ID |
+----------------------------------------------+
| 312 Equity 14-DEC-14 1 |
| 23343 Equity 17-DEC-11 5 |
| 1234 Equity 19-SEPT-13 2 |
| 99999 Equity 16-OCT-10 9 |
+----------------------------------------------+
Istnieją dwa przypadki, które zasadniczo koncentrują się na tym samym problemie:
- Jak widać, istnieją dwa przypadki, kiedy
project_id = 1
data wstawienia jest zawsze taka sama. Jednak z mojego zapytania powyżej nadal otrzymujęnull
z powrotem z powoduordering
. Jak mogę odzyskać numer312
bez uzyskiwania wartościnull
lub0
? - Jeśli
projectID = 2
istnieją różne daty wstawiania, a wcześniejsze daty mają elementyTAG_VALUE
null
. Jednak chciałbym miećtagValue
z| 1234 Equity 19-SEPT-13 2 |
, ponieważ jest to najnowsza wartość?
Jak mogę po prostu zignorować wartości wszystkich null
a także 0
wartości i tylko wziąć numeryczna, która jest większa niż wartość 0
z najwcześniejszą datą?
Naprawdę doceniam twoją odpowiedź!
Proszę poprawić zapytanie: Z projektu p Z aktualizacji u – Rusty
Czy TAG_VALUE to VARCHAR2 lub NUMBER? To wygląda jak model EAV, a jeśli używasz typowego typu danych, odpowiedź będzie znacznie bardziej skomplikowana. –
@JonHeller Wartość parametru TAG_Value jest NUMERYCZNA. Co masz na myśli, mówiąc o modelu EAV? – mrquad