There is a useful function in SQL Server called TOP N With Ties. It is like TOP N (which is like the Oracle ROWNUM function) but if you are ordering by a non unique column, it retrieves all common rows associated with the last row in the set.
The code below will achieve this functionality,this function return a date if you want to use it with other type for example,just change the return of the function from date to number:
CREATE OR REPLACE FUNCTION TOP_DATE(P_TABLE_NAME VARCHAR2,P_COLUMN_NAME VARCHAR2,P_RANGE NUMBER ,P_DISTINCT VARCHAR2 DEFAULT 'DISTINCT',P_ORDER_BY VARCHAR2 DEFAULT 'DESC',P_WHERE VARCHAR2 DEFAULT NULL) RETURN DATE IS
V_DATE DATE;
V_DISTINCT VARCHAR2(10);
V_SQL VARCHAR2(3000);
V_WHERE VARCHAR2(1000);
BEGIN
IF P_RANGE <= 0 THEN V_DATE := NULL; DBMS_OUTPUT.PUT_LINE('Range must be greater than 0'); ELSIF NVL(LTRIM(RTRIM(UPPER(P_DISTINCT))),'DISTINCT') <> 'DISTINCT' THEN
V_DATE := NULL;
DBMS_OUTPUT.PUT_LINE('P_DISTINCT must be null or = DISTINCT');
ELSIF LTRIM(RTRIM(UPPER(P_ORDER_BY))) NOT IN ('ASC','DESC') THEN
V_DATE := NULL;
DBMS_OUTPUT.PUT_LINE('P_ORDER_BY must be ASC or DESC');
ELSE
BEGIN
IF P_DISTINCT IS NULL OR P_DISTINCT = '' OR P_DISTINCT = ' ' THEN
V_DISTINCT := ' ';
ELSE
V_DISTINCT := 'DISTINCT';
END IF;
IF P_WHERE IS NULL THEN
V_WHERE := ' ';
ELSE
V_WHERE := P_WHERE;
END IF;
V_SQL := 'select 'P_COLUMN_NAME' from (select rownum range,'P_COLUMN_NAME
' from (select 'V_DISTINCT' 'P_COLUMN_NAME' from 'P_TABLE_NAME' 'V_WHERE
' order by 'P_COLUMN_NAME' 'P_ORDER_BY'))'
' where range = 'P_RANGE;
EXECUTE IMMEDIATE V_SQL
INTO V_DATE;
EXCEPTION WHEN OTHERS THEN V_DATE := NULL;
END;
END IF;
RETURN V_DATE;
END;
/
Subscribe to:
Post Comments (Atom)

No comments:
Post a Comment