Bug? using MAX() function on char(1) column returns something larger

details:
-- we have a complex nested query, where we are essentially returning the max() value into a variable
-- the max() function is being used on a char(1) column
-- where MAX() is part of an inner select, we have started getting
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
errors.
SELECT MAX(X) INTO var FROM ... works in 9i and 10g
SELECT X INTO var FROM (SELECT MAX(X) X FROM ... worked in 9i, does not work in 10g!
-- We never had problems with the code until upgrading to 10g release 2.
-- the Solution is to cast the final value with TO_CHAR(). The cast MUST be done at the outer most point of the select:
SELECT TO_CHAR(X) INTO var FROM (SELECT MAX(X) X FROM ... works
SELECT X INTO var FROM (SELECT TO_CHAR(MAX(X)) X FROM ... causes an error!
The following script demonstrates the issue, and includes the solution:
* October 3, 2006
* Possible SQL bug introduced with Oracle 10G
* Natalie Gray DBA/Developer, Environment Canada
* Description:
* Have discovered a problem with using the MAX() function
* on columns of type char(1)
* only an issue when used in an inner select
* solution (see test 4)
CREATE TABLE SQL_BUG_TEST
X NUMBER,
Y NUMBER,
Z CHAR(1)
INSERT INTO SQL_BUG_TEST (X, Y, Z)
VALUES (1,1,'A');
INSERT INTO SQL_BUG_TEST (X, Y, Z)
VALUES (1,1,'B');
INSERT INTO SQL_BUG_TEST (X, Y, Z)
VALUES (1,2,'C');
INSERT INTO SQL_BUG_TEST (X, Y, Z)
VALUES (1,2,'D');
DECLARE
TYPE REC IS RECORD (
      x SQL_BUG_TEST.X%TYPE,
      y SQL_BUG_TEST.Y%TYPE,
      z SQL_BUG_TEST.Z%TYPE
v_rec REC;
BEGIN
      -- DISPLAY THE TABLE DATA
      BEGIN
             DBMS_OUTPUT.PUT_LINE('TABLE DATA:');
            DBMS_OUTPUT.PUT_LINE('');
             DBMS_OUTPUT.PUT_LINE('SELECT * FROM SQL_BUG_TEST ORDER BY X,Y,Z;');
             FOR crs IN (SELECT *
                                 FROM SQL_BUG_TEST
                           ORDER BY X,Y,Z) LOOP
                DBMS_OUTPUT.PUT_LINE(':'||crs.X||':'||crs.Y||':'||crs.Z);
            END LOOP;
      EXCEPTION WHEN OTHERS THEN
             DBMS_OUTPUT.PUT_LINE(SQLERRM);       
      END;
      -- TEST 1
      -- returning result from MAX into a variable when the MAX is in the outer most select
      -- does not cause an error
      BEGIN
             DBMS_OUTPUT.PUT_LINE('*****************************************************');
             DBMS_OUTPUT.PUT_LINE('TEST 1');
            DBMS_OUTPUT.PUT_LINE('');
             DBMS_OUTPUT.PUT_LINE('SELECT X, Y, MAX(Z) Z');
            DBMS_OUTPUT.PUT_LINE('FROM SQL_BUG_TEST');
            DBMS_OUTPUT.PUT_LINE('GROUP BY X,Y');
            FOR crs IN (SELECT X, Y, MAX(Z) Z
                                 FROM SQL_BUG_TEST
                           GROUP BY X, Y
                           ORDER BY X,Y,Z) LOOP
                 DBMS_OUTPUT.PUT_LINE(':'||crs.X||':'||crs.Y||':'||crs.Z);
            END LOOP;
      EXCEPTION WHEN OTHERS THEN
           DBMS_OUTPUT.PUT_LINE(SQLERRM);
      END;
      -- TEST 2
      -- returning MAX() from an inner select to an outer select and then into a variable
      -- causes an error
      BEGIN
             DBMS_OUTPUT.PUT_LINE('*****************************************************');
             DBMS_OUTPUT.PUT_LINE('TEST 2');
            DBMS_OUTPUT.PUT_LINE('THIS DID NOT CAUSE AN ERROR WITH ORACLE 9i');
            DBMS_OUTPUT.PUT_LINE('');
             DBMS_OUTPUT.PUT_LINE('SELECT * INTO v_rec');
            DBMS_OUTPUT.PUT_LINE('FROM');
            DBMS_OUTPUT.PUT_LINE('(SELECT X, Y, MAX(Z) Z');
            DBMS_OUTPUT.PUT_LINE('FROM SQL_BUG_TEST');
            DBMS_OUTPUT.PUT_LINE('GROUP BY X,Y)');
            DBMS_OUTPUT.PUT_LINE('WHERE Y = 1');
            SELECT * INTO v_rec
            FROM
            (SELECT X, Y, MAX(Z) Z
             FROM SQL_BUG_TEST
             GROUP BY X, Y)
            WHERE Y = 1;
            DBMS_OUTPUT.PUT_LINE(':'||v_rec.X||':'||v_rec.Y||':'||v_rec.Z);
      EXCEPTION WHEN OTHERS THEN
           DBMS_OUTPUT.PUT_LINE(SQLERRM);
      END;
      -- TEST 3
      -- casting the result from MAX to char before returning to the outer select
      -- still causes an error
      BEGIN
             DBMS_OUTPUT.PUT_LINE('*****************************************************');
             DBMS_OUTPUT.PUT_LINE('TEST 3');
            DBMS_OUTPUT.PUT_LINE('');
             DBMS_OUTPUT.PUT_LINE('SELECT * INTO v_rec');
            DBMS_OUTPUT.PUT_LINE('FROM');
            DBMS_OUTPUT.PUT_LINE('(SELECT X, Y, to_char(MAX(Z)) Z');
            DBMS_OUTPUT.PUT_LINE('FROM SQL_BUG_TEST');
            DBMS_OUTPUT.PUT_LINE('GROUP BY X,Y)');
            DBMS_OUTPUT.PUT_LINE('WHERE Y = 1');
            SELECT * INTO v_rec
            FROM
            (SELECT X, Y, to_char(MAX(Z)) Z
             FROM SQL_BUG_TEST
             GROUP BY X, Y)
            WHERE Y = 1;
            DBMS_OUTPUT.PUT_LINE(':'||v_rec.X||':'||v_rec.Y||':'||v_rec.Z);
      EXCEPTION WHEN OTHERS THEN
           DBMS_OUTPUT.PUT_LINE(SQLERRM);
      END;
      -- TEST 4 - SOLUTION
      -- the return value of MAX must be cast with to_char at the point where it is assigned to
      -- variable (outer most select)
      BEGIN
             DBMS_OUTPUT.PUT_LINE('*****************************************************');
             DBMS_OUTPUT.PUT_LINE('TEST 4 SOLUTION');
            DBMS_OUTPUT.PUT_LINE('');
             DBMS_OUTPUT.PUT_LINE('SELECT X, Y, TO_CHAR(Z) Z INTO v_rec');
            DBMS_OUTPUT.PUT_LINE('FROM');
            DBMS_OUTPUT.PUT_LINE('(SELECT X, Y, MAX(Z) Z');
            DBMS_OUTPUT.PUT_LINE('FROM SQL_BUG_TEST');
            DBMS_OUTPUT.PUT_LINE('GROUP BY X,Y)');
            DBMS_OUTPUT.PUT_LINE('WHERE Y = 1');
            SELECT X, Y, TO_CHAR(Z) Z INTO v_rec
            FROM
            (SELECT X, Y, MAX(Z) Z
             FROM SQL_BUG_TEST
             GROUP BY X, Y)
            WHERE Y = 1;
            DBMS_OUTPUT.PUT_LINE(':'||v_rec.X||':'||v_rec.Y||':'||v_rec.Z);
      EXCEPTION WHEN OTHERS THEN
           DBMS_OUTPUT.PUT_LINE(SQLERRM);
      END;
END;

I certainly looks like a bug, but you should raise an iTAR on Metalink since Oracle does not monitor this forum.
I was able to replicate your results on my 10.2.0.1 database.
There is an easier workaround than yours. Try
ALTER TABLE sql_bug_test MODIFY (z VARCHAR2(1));That seems to eliminate the problem on my instance.
John

Similar Messages

  • How to use MAX function in SSAS MDX Query

    I want to run this Query with MAX Condition on LAST_DATA_UPDATE Column .

    Hi Ashishsingh,
    According to your description, you want to know how to use MAX function in SQL Server Analysis Services MDX Query, right? In this case, please refer to the link below which describe the syntax and sample of MDX function.
    http://technet.microsoft.com/en-us/library/ms145601.aspx
    http://www.mdxpert.com/Functions/MDXFunction.aspx?f=64
    Hope this helps.
    Regards,
    Charlie Liao
    TechNet Community Support

  • Using max function in PL/SQL

    VERY URGENT...
    Am new to oracle...
    I've written a package that display gif images in form of histogram/bar chart. using html,
    I need to use max function to display values proportionately.
    please help. i need to complete this assignment by 2/9/00 by 10.00 am at the latest. I've half written a function but I don't know if there's a simpler way fo doing this. html enabled

    First of all Thanks to all gentlemen who replied ..many thanks ...
    Tried the ROW_NUMBER() option but still it is taking time...have given output for the query and tkprof results as well. Even when it doesn't fetch any record ( this is a valid cased because the input header id doesn't have any workflow request submitted & hence no entry in the wf_items table)..then also see the time it has taken.
    Looked at the RANK & DENSE_RANK options which were suggested..but it is still taking time..
    Any further suggestions or ideas as to how this could be resolved..
    SELECT 'Y', 'Y', ITEM_KEY
    FROM
    ( SELECT ITEM_KEY, ROW_NUMBER() OVER(ORDER BY BEGIN_DATE DESC) RN FROM
    WF_ITEMS WHERE ITEM_TYPE = 'xxxxzzzz' AND ROOT_ACTIVITY = 'START_REQUESTS'
    AND SUBSTR(ITEM_KEY,1,INSTR(ITEM_KEY,'-') - 1) = :B1
    ) T WHERE RN <= 1
    call count cpu elapsed disk query current rows
    Parse 0 0.00 0.00 0 0 0 0
    Execute 1 0.00 1.57 0 0 0 0
    Fetch 1 8700.00 544968.73 8180 8185 0 0
    total 2 8700.00 544970.30 8180 8185 0 0
    many thanks

  • Oracle:how to use max() function in case expression

    how to use max() function in case expression, Please explain with any example

    Hope this helps and should be self explanatory
    with t as
    (select 1 col,100 col2 from dual union
    select 2 ,100 from dual union
    select 2 ,200 from dual union
    select 3,100  from dual union
    select 3,200  from dual  )
    select col, case when max(col2)=100 then 'with 100 range'
    when  max(col2)=200 then 'with 200 range' end  from t group by col

  • Max value without using max() function

    Hi
    Is there any way to get the max value from a table without using MAX() function
    Thanks

    well if you think about it i'm sure you'll find a solution
    what does max(field) means, it simply is the value of the field where no other value of the same field that is > than this value exists.
    consider the following :
    table TAB(
    fld NUMBER(5));
    translate the logic and you'll have
    select a.fld from TAB a where NOT EXISTS(select b.fld from TAB b where b.fld>a.fld) and rownum=1;
    of course there are better ways i'm sure, you'll just have to figure'em out.

  • Using Max Function in View Criteria

    Hi
    I am having a requirement where by i need to make use of max function in view criteria but not able to see any such option. Can someone please help me over it. Here is the requirement.
    In table i will be having multiple rows for an employee and i need to pick latest row based on a column say request_id For e.g.
    Emp RequestId
    A 1
    A 2
    A 3
    A 4
    So if i pass the employee id i should get Row Number 4. In simple SQL language I want something like this
    select * from emp where empid=A and requestid=( select max(requestid) from emp where empid=A)
    Just wanted to know is there any approach that i can use to do all this as part of View Criteria or any other way.
    Any help is appreciated!!!
    Thanks
    AJ

    One way is this -
    1)https://blogs.oracle.com/adf/entry/using_groovy_aggregate_functions_in (You might need to create a self-referencing VL for this , try if it works using a ViewAccessor too)
    OR
    Order by RequestId descending in your SQL for the VO if thats ok , then have the ViewCriteria for the EmpId and programmatically pickup the first row...

  • Want to use analytical function as a Virtual column

    I am wondering if I can use an analytic function as a virtual column to a table?
    The table conatins a field named BUSINESS_RUN_DATE, which becomes the EXPIRY_DATE of the on the previous record. So we want to add this value right into the table without resorting t a view.
    This is what I tried to add the column to the table:
    alter table stg_xref_test_virtual
    ADD (expiry_date2 date generated always AS (max (business_run_date) over
    *(PARTITION BY ntrl_src_sys_key order by business_run_date*
    rows between 1 preceding and 1 following))) ;
    It give me an error that GROUP BY is not allowed.
    Can someone help out>?
    Thanks,
    Ian

    From the documentation.
    [Column Expressions|http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/expressions005.htm#BABIGHHI]
    A column expression, which is designated as column_expr in subsequent syntax diagrams, is a limited form of expr. A column expression can be a simple expression, compound expression, function expression, or expression list, but it can contain only the following forms of expression:* Columns of the subject table — the table being created, altered, or indexed
    * Constants (strings or numbers)
    ** Deterministic functions — either SQL built-in functions or user-defined functions*
    No other expression forms described in this chapter are valid. In addition, compound expressions using the PRIOR keyword are not supported, nor are aggregate functions.
    You can use a column expression for these purposes:
    * To create a function-based index.
    * To explicitly or implicitly define a virtual column. When you define a virtual column, the defining column_expr must refer only to columns of the subject table that have already been defined, in the current statement or in a prior statement.
    The combined components of a column expression must be deterministic. That is, the same set of input values must return the same set of output values.

  • How to use, Case function and Filter in Column Formula?

    Hello All,
    I am using case function and also would like to filter value to populate.
    Below is showing error :
    case
    when '@{Time}' = 'Year' then "Time"."Fiscal Year"
    when '@{Time}' = 'Quarter' then "Time"."Fiscal Quarter"
    when '@{Time}' = 'Month' then FILTER ("Time"."Fiscal Period" USING "Time"."Fiscal Period" NOT LIKE 'A%')
    else ifnull('@{Time}','Selection Failed') end
    Thanks, AK

    when '@{Time}' = 'Month' then FILTER ("Time"."Fiscal Period" USING "Time"."Fiscal Period" NOT LIKE 'A%')I dont think Filter this works here or any other data types except number.
    Try to use option Column's->Filter->Advanced->Convert this filter to SQL
    If helps mark

  • Cannot use MAX function in PS Query

    I am trying to use Query to select the max ( effdt ) from a table.
    First, I use the 'Criteria' page to have
    (1) Expression 1 = A.EFFDT - Effective Date, (2) Condition type = equal to, (3) Expression 2 = Subquery
    Then the Subquery is:
    (1) In the 'Field' page, I choose field E.EFFDT - Effective Date, (2) then click on 'EDIT', (3) then click on 'Max', (4) then click on 'OK' button
    I then get this message: 'This field is an aggregate field but is being used in non-having criteria.(139,136). The query may fail if this is not corrected'
    And as i try run anyway this query, i get this message:
    SQL error. Stmt #: 5653 Error Position: 349 Return: 934 - ORA-00934: group function is not allowed here
    A SQL error occurred. Please consult your system log for details.
    Error in running query because of SQL Error, Code=934, Message=ORA-00934: group function is not allowed here (50,380)
    NOTE: This max sql would work if i run using SqlPlus
    How can i get Query to use max( effdt ) ?
    Any clue anyone ? THANKS

    Yes Using it as MAX is OK.
    Problem is once you use it as MAX of a field, it wouln't allow this field for you to use it anymore.
    A workaround i found that helped is to use the expression let's say 'MAX( a.JOB )' and use this as field.
    This way, the system will allow me to use the JOBCODE field.
    Thank you for all your helps as it leads me to the soln.

  • Using UPPER function with LONG datatype column

    Hi,
    Can anyone tell that how can I use UPPER function on a column which has data type as-- LONG?
    For ex--
    SELECT * FROM TABLE WHERE UPPER(LONG_COL) LIKE 'MYTEXT%';
    thanks,
    Abhijeet
    Edited by: @bhijeet ☻☻☻ on Nov 18, 2009 5:20 AM

    @bhijeet ☻☻☻ wrote:
    Yes I know that that's why I am asking about an alternate solution for it. Could you please let me know if you have any solution to do it?
    Thanks,
    AbhijeetI think you'll have to write a function to do this for you. You can use DBMS_SQL to break a LONG into pieces and work with 32K segments. I am not sure how to put the converted data back into the LOB at that point, though DBMS_SQL might provide a way to do this.

  • How to use MAX() function with date field

    Hi Frzz,
    I have created a Graphical calculation view in which i have multiple records for each employee with different dates. But my requirement is to take the records which have maximum date.
    I have converted the date into Integer and applied the MAX() function. But still am getting multiple records.
    Is there is any other way we can achieve this requirement in Graphical Calculation view??  Your suggestion will really help me.
    Thank  you.
    Krishna.

    Hmm... what have you tried out so far?
    Look, I took the effort and created a little example, just for you
    Assume we have a table that contains the logon dates of users.
    Every line contains the logon date and some info on the user.
    Very much like a not-normalized log file could look like.
    Now, the output we want is: one line per user with the most current logon time.
    Not too difficult:
    1. Have a aggregation node that gives you the distinct user details - one line for every user:
    2. Have another aggregation node that gives you the last (MAX) logon date per user:
    Finally you do a 1:1 join on the USER_ID and map the result to the output.
    Easy as pie
    - Lars

  • Performance issue with using MAX function in pl/sql

    Hello All,
    We are having a performance issue with the below logic wherein MAX is being used in order to get the latest instance/record for a given input variable ( p_in_header_id).. the item_key is having the format as :
    p_in_header_id - <number generated from a sequence>
    This query to fetch even 1 record takes around 1 minutes 30 sec..could someone please help if there is a better way to form this logic & to improve performance in this case.
    We want to get the latest record for the item_key ( this we are getting using MAX (begin_date)) for a given p_in_header_id value.
    Query 1 :
    SELECT item_key FROM wf_items WHERE item_type = 'xxxxzzzz'
    AND SUBSTR (item_key, 1, INSTR (item_key, '-') - 1) =p_in_header_id
    AND root_activity ='START_REQUESTS'
    AND begin_date =
    (SELECT MAX (begin_date) FROM wf_items WHERE item_type = 'xxxxzzzz'
    AND root_activity ='START_REQUESTS'
    AND SUBSTR (item_key, 1, INSTR (item_key, '-') - 1) =p_in_header_id);
    Could someone please help us with this performance issue..we are really stuck because of this
    regards

    First of all Thanks to all gentlemen who replied ..many thanks ...
    Tried the ROW_NUMBER() option but still it is taking time...have given output for the query and tkprof results as well. Even when it doesn't fetch any record ( this is a valid cased because the input header id doesn't have any workflow request submitted & hence no entry in the wf_items table)..then also see the time it has taken.
    Looked at the RANK & DENSE_RANK options which were suggested..but it is still taking time..
    Any further suggestions or ideas as to how this could be resolved..
    SELECT 'Y', 'Y', ITEM_KEY
    FROM
    ( SELECT ITEM_KEY, ROW_NUMBER() OVER(ORDER BY BEGIN_DATE DESC) RN FROM
    WF_ITEMS WHERE ITEM_TYPE = 'xxxxzzzz' AND ROOT_ACTIVITY = 'START_REQUESTS'
    AND SUBSTR(ITEM_KEY,1,INSTR(ITEM_KEY,'-') - 1) = :B1
    ) T WHERE RN <= 1
    call count cpu elapsed disk query current rows
    Parse 0 0.00 0.00 0 0 0 0
    Execute 1 0.00 1.57 0 0 0 0
    Fetch 1 8700.00 544968.73 8180 8185 0 0
    total 2 8700.00 544970.30 8180 8185 0 0
    many thanks

  • Using Max function

    I have the following tables along with their attributes(the
    stared fields show the primary key:
    Agent(AgentPhoneNo*, NameOfAgent)
    Constituency(ConstituencyNo*,
    ConstituencyName,District,RegionCode)
    PollingStation(StationNo*,ConstituencyNo*,AgentPhoneNo,
    StationName)
    VoteResults(Party*, ResultsCategory*,Votes, AgentPhoneNo*)
    Results category has two values (S,L) and the number of
    parties is variable
    My issue is this, below is my code that returns the total
    votes received by each party with each constituency. This
    query works fine.
    <cfquery name="WinningPartyinConstituency"
    datasource="#request.datasource#">
    SELECT c.ConstituencyName, s.ConstituencyNo, v.Party,
    Sum(v.Votes) AS TotalVotes
    From (Constituency c
    INNER JOIN PollingStation s ON c.ConstituencyNo =
    s.ConstituencyNo)
    INNER JOIN VoteResults v ON s.AgentPhoneNo = v.AgentPhoneNo
    WHERE v.ResultCategory = 'L' AND s.ConstituencyNo IN (Select
    ConstituencyNo From Constituency)
    Group By c.ConstituencyName, s.ConstituencyNo, v.Party
    Order By c.ConstituencyName
    </cfquery>
    Now I want to check and return the name and total votes of
    the party with the maximum votes within each constituency. And but
    I can't seem to figure out how to do that, especially because the
    max() function takes only to
    values.
    I will appreciate any guidance on how to write a query that
    returns the the party with the maximum votes in each constituency
    and the votes it got. TIA

    My approach would be to do 2 or 3 Q of Qs to get the numbers
    I need.

  • Using lookup function but to show multiple returns?

    Okay so I have been talked through how to use a lookup function to show which student in my class has scored the highest grade.  The formula used displays there name in one column and the score they achieved in another column which I have set up in a small seperate table.  However as suggested in my intial lookup function search it was suggested that I would encounter a problem if two students both achieved the same highest score.  However in the results table I have created it only shows one student.  Is it possible to have a function or formula that will simply show the top scores and the students that scored it when they are tied? 
    Thanks
    Marcus

    The easiest way to accomplish this, Marcus, is by simply sorting all rows by grade.  Sure, you can click on the column tab and hit "sort ascending", but I'm guessing you want something a little more dynamic than that.
    So I've set up a class of 20 students and gave them all random grades btwn 40 - 99.  (That's how it was done when I was in high school.  )  I added a third column which takes that grade, multiplies it by 1000, and adds the row number of the student.  This creates a unique identifier based on a possibly-non-unique grade:
    Now it's simply a matter of using the LARGE function to rank these new identifiers, and then using LOOKUP to get the actual grade and name for that identifier.  (Note that the grades changed; changing the focus from one cell to another creates new random values for the grades.)
    The formula for columns b and c for this Ranking table are standard Lookup functions:
    =LOOKUP($A1,Grades :: $C,Grades :: $B) to get the grades  ($A2 for 2nd column, etc.), and
    =LOOKUP($A1,Grades :: $C,Grades :: $A) to get the names.
    I'd suggest hiding these identifier columns.
    Now, to limit this display to the "X" highest grades, I'm going to continue this into another reply.
    Vince

  • SQL query using MAX function

    I am trying to only display the records where the 'date_entered' is the most recent date per case number.
    SELECT distinct c.case_number, u.email,c.assigneddate_chart,
    --m.date_entered,
    max(m.date_entered)as last_date_entered,
    trunc(sysdate)-trunc(c.assigneddate_chart)days_late,
    trunc(sysdate)-trunc(m.date_entered)addl_days_late
    from chart c, chart_user_roles u,comments m
    where
    (c.case_status IN ('Open','Pending')) and
    c.case_number=m.case_number
    group by c.case_number,
    u.email,c.assigneddate_chart,m.date_enteredRight now, this is the output im am getting.
    Output:
    CASE_NUMBER------EMAIL---------ASSIGNEDDATE_CHART---LAST_DATE_ENTERED---DAYS_LATE--ADDL_DAYS_LATE
    [email protected]----06-NOV-09-----------------31--------------------11
    [email protected]----10-NOV-09-----------------31---------------------7
    [email protected]----06-NOV-09-----------------31--------------------11
    [email protected]----06-NOV-09-----------------31--------------------11
    [email protected]----06-NOV-09-----------------31--------------------11
    [email protected]----03-NOV-09-----------------34--------------------14
    I am wanting to achieve this output:
    Therefore, based on the data below, the only records that i am wanting to display are:
    [email protected]----10-NOV-09-----------------31---------------------7
    [email protected]----03-NOV-09-----------------34--------------------14
    Thanks
    Deanna

    Is there a reason that you have a DISTINCT in your query? It always makes me nervous to see that where it's not clearly necessary because it frequently means that a developer is missing a join condition and is using the DISTINCT to mask that fact.
    On to the meat of your question, though, is there a potential for ties? If so, how do you want to handle that-- do you want two rows for that case, do you want to break the tie using some other column, do you want to pick an arbitrary row? If you want to pick an arbitrary row
    SELECT case_number, email, assignedDate_chart, last_date_entered, days_late, addl_days_late
      FROM (
        SELECT a.*, row_number() over (partition by case_number order by date_entered) rn
          FROM (<<your query>>) a
    WHERE rn = 1If you want to do something else, just adjust the analytic function and use RANK or add a tie-breaker to the ORDER BY.
    Justin

Maybe you are looking for