Łukasz W.

Łukasz W. SQL/ETL/BI

Temat: wybierania rekordów

Reguła wyboru "Wyceny Preferowanej" (EKPORT_WYCENA):
- na podstawie pola VALUE_TYPE- w pierwszej kolejności szukamy Bankowej (WWE), następnie Rynkowej (RYN), następnie Odtworzeniowa (ODT)
- potem jeśli wiele to na podstawie pola VALUATION_MARKER - w pierszej kolejności Z, w drugiej B, w trzeciej D, w czwartej A
- potem po dacie VALUE_DATE(najpierw najnowsza)
- potem po kwocie VALUATION_AMOUNT (od najmniejszej)

Reguła wyboru "Wyceny Rynkowej" (EKSPORT_WYCENA):
- System wyszukuje wyceny w takiej kolejności:
a) w pierwszej kolejności rekordy z VALUE_TYPE = RYN i VALUATION_MARKER = D
b) w drugiej kolejności rekordy z VALUE_TYPE = RYN i VALUATION_MARKER = A
- w przypadku występowania wielu rekordów RYN/D lub RYN/A system wybiera najnowszy (VALUATION_DATE) a jeśli jest wiele z tą samą datą to taki z najniższą wyceną (VALUATION_AMOUNT)

jak zaimplementować powyższe
mam takie warunki wybierania dla przykładowej tabeli rekordow jest okolo 40tys
id, collateral_id, valuation_date, valuation_amount, value_type,valuation_marker
1, 11, '2016-01-01' 10000.00 'RYN' D
2. 11 '2015-10-16' 7000.00 'WWE' Z
3. 11 '2016-02-03' 13000.00 'ODT' A
4. 13 '2014-04-14' 2000000.00 WWE A
5. 13 2014-05-17' 170000.00 RYN D
6 13 '2015-01-08' 174000.00 ODT Z
7. 15 '2016-04-03' 15000.00 RYN D
8 15 '2016-04-09' 15000.00 WWE A
9 15 '2016-04-21' 14500.00 ODT D

głowie się i jakoś brakuje pomysłu

dziękuje i pozdrawiam
Łukasz
Monika Mitura

Monika Mitura Oracle Developer,
Pretius

Temat: wybierania rekordów

Pierwsze co mi na myśl przychodzi to posortować zgodnie z wymaganiami i wziąć pierwszy rekord.

Temat: wybierania rekordów

Wskazówka dla punktu Reguła wyboru "Wyceny Preferowanej":

Dane testowe

CREATE TABLE [dbo].Dane(
id INT PRIMARY KEY,
collateral_id INT,
valuation_date DATETIME,
valuation_amount DECIMAL(10,2),
value_type CHAR(3),
valuation_marker CHAR(1))

INSERT INTO [dbo].Dane(id, collateral_id, valuation_date, valuation_amount, value_type, valuation_marker)
VALUES( 1, 11, CONVERT(varchar,'2016-01-01',120), 10000.00, 'RYN', 'D')
,( 2, 11, CONVERT(varchar,'2015-10-16',120), 7000.00 , 'WWE', 'Z')
,( 3, 11, CONVERT(varchar,'2016-02-03',120), 13000.00, 'ODT', 'A')
,( 4, 13, CONVERT(varchar,'2014-04-14',120), 2000000.00, 'WWE', 'A')
,( 5, 13, CONVERT(varchar,'2014-05-17',120), 170000.00, 'RYN', 'D')
,( 6, 13, CONVERT(varchar,'2015-01-08',120), 174000.00, 'ODT', 'Z')
,( 7, 15, CONVERT(varchar,'2016-04-03',120), 15000.00, 'RYN', 'D')
,( 8, 15, CONVERT(varchar,'2016-04-09',120), 15000.00, 'WWE', 'A')
,( 9, 15, CONVERT(varchar,'2016-04-21',120), 14500.00, 'ODT', 'D')

SELECT * FROM [dbo].Dane


Można skorzystać z tabeli pomocniczej (w przykładzie jako klauzula WITH):

WITH tabOrder(VALUE_TYPE,VALUATION_MARKER, ID_ORDER)AS
(SELECT 'WWE' VALUE_TYPE, 'Z' VALUATION_MARKER, 1 ID_ORDER
UNION
SELECT 'WWE', 'B', 2
UNION
SELECT 'WWE', 'D', 3
UNION
SELECT 'WWE', 'A', 4
UNION
--RYN
SELECT 'RYN', 'Z', 5
UNION
SELECT 'RYN', 'B', 6
UNION
SELECT 'RYN', 'D', 7
UNION
SELECT 'RYN', 'A', 8
UNION
--ODT
SELECT 'ODT', 'Z', 9
UNION
SELECT 'ODT', 'B', 10
UNION
SELECT 'ODT', 'D', 11
UNION
SELECT 'ODT', 'A', 12)

SELECT id
, collateral_id
, valuation_date
, valuation_amount
, (SELECT ID_ORDER FROM tabOrder t WHERE t.VALUE_TYPE = d.value_type AND t.VALUATION_MARKER = d.valuation_marker) id_order
, value_type
, valuation_marker
FROM [dbo].Dane d ORDER BY id_order, valuation_date desc, valuation_amount


Dla drugiego przypadku pewnie coś podobnego, mogą też być grupowania.
Łukasz W.

Łukasz W. SQL/ETL/BI

Temat: wybierania rekordów

dziękuje za sugestię,
pozostaje wycena rynkowa....

Pozdrawiam

konto usunięte

Temat: wybierania rekordów

Mam jakiś poważny problem natury pozawczej... Ktoś ma wpisane SQL Developer jako stanowisko i nie jest w stanie sklecić zapytanie SQL? Nie wiem, może teraz to się w wizardzie robi?

Jakimś CASEm, albo takimi UNIONami przypisujesz pierwszemu kryterium wartość 2, drugiemu 1, pozostałym 0.
VALUE_TYPE = RYN i VALUATION_MARKER = D -> 2
VALUE_TYPE = RYN i VALUATION_MARKER = A -> 1
else 0
Tu jest przykład jak to się robi w PostreSQLu:
http://stackoverflow.com/questions/27800119/postgresql...
Potem sorta robisz po tej kolumnie. Potem sortujesz po pozostałych kryteriach. Jak wymienione w opisie.

Następnym razem w tytule podaj nazwę bazy danych - chociaż sądząc po opisie stanowiska... Dalej warto podać wersję, czy można używać dodatków hurtownianych itp.
Łukasz W.

Łukasz W. SQL/ETL/BI

Temat: wybierania rekordów

zrobilem to unionami tylko nie zamnkalem tematu
dzieki
Marcin Mackiewicz

Marcin Mackiewicz Programista JAVA, RS
Adware Polska

Temat: wybierania rekordów

Zakładam, że kolega "SQL Developer" normalizuje bazę więc ma słowniki dla valuation_type oraz valuation_marker albo stara się je mieć. U mnie pierwszaki takie coś dostają jako normalne zadania.
Utrudniam bo to za proste.

Przykład dla PostgreSQL 9.x:

1. Przygotowanie bazy danych oraz danych testowych:
DROP TABLE IF EXISTS dane;
DROP TABLE IF EXISTS valuation_types;
DROP TABLE IF EXISTS valuation_markers;

CREATE TABLE dane(
id INT PRIMARY KEY,
collateral_id INT,
valuation_date DATE,
valuation_amount DOUBLE PRECISION,
value_type VARCHAR(3),
valuation_marker VARCHAR(1)
);

CREATE TABLE valuation_types(
code VARCHAR(3) PRIMARY KEY,
kolejnosc INT
);

CREATE TABLE valuation_markers(
code VARCHAR(1) PRIMARY KEY,
kolejnosc INT
);

INSERT INTO dane VALUES (1, 11, '2016-01-01', 10000.00, 'RYN', 'D');
INSERT INTO dane VALUES (2, 11, '2015-10-16', 7000.00, 'WWE', 'Z');
INSERT INTO dane VALUES (3, 11, '2016-02-03', 13000.00, 'ODT', 'A');
INSERT INTO dane VALUES (4, 13, '2014-04-14', 2000000.00, 'WWE', 'A');
INSERT INTO dane VALUES (5, 13, '2014-05-17', 170000.00, 'RYN', 'D');
INSERT INTO dane VALUES (6, 13, '2015-01-08', 174000.00, 'ODT', 'Z');
INSERT INTO dane VALUES (7, 15, '2016-04-03', 15000.00, 'RYN', 'D');
INSERT INTO dane VALUES (8, 15, '2016-04-09', 15000.00, 'WWE', 'A');
INSERT INTO dane VALUES (9, 15, '2016-04-21', 14500.00, 'ODT', 'D');

INSERT INTO valuation_types VALUES ('WWE', 1), ('ODT', 3), ('RYN', 2);
INSERT INTO valuation_markers VALUES ('Z', 1), ('B', 2), ('D', 3), ('A', 4);
2. Rozwiązanie dla "wycena preferowana":
SELECT 
*
FROM dane d
JOIN valuation_types t ON d.value_type = t.code
JOIN valuation_markers m ON d.valuation_marker = m.code
ORDER BY t.kolejnosc, m.kolejnosc, d.valuation_date DESC, d.valuation_amount
LIMIT 1;
3. Rozwiązanie dla "wycena rynkowa":
SELECT * FROM dane 
WHERE value_type = 'RYN' AND valuation_marker IN ('A', 'D')
ORDER BY valuation_marker DESC, valuation_date DESC, valuation_amount
LIMIT 1;

Następna dyskusja:

[postgres] usuwanie zduplik...




Wyślij zaproszenie do