Firebird Query- Return first row each group

前端 未结 3 1043
不知归路
不知归路 2021-01-22 02:03

In a firebird database with a table \"Sales\", I need to select the first sale of all customers. See below a sample that show the table and desired result of query.



        
相关标签:
3条回答
  • 2021-01-22 02:42

    So simple as:

    select CUSTOMERID min(DTHRSALE) from SALES group by CUSTOMERID

    0 讨论(0)
  • 2021-01-22 02:43

    Search for the sales with no earlier sales:

    SELECT S1.*
    FROM SALES S1
    LEFT JOIN SALES S2 ON S2.CUSTOMERID = S1.CUSTOMERID AND S2.DTHRSALE < S1.DTHRSALE
    WHERE S2.ID IS NULL
    

    Define an index over (customerid, dthrsale) to make it fast.

    0 讨论(0)
  • 2021-01-22 02:56

    In Firebird 2.5 you can do this with the following query; this is a minor modification of the second part of the accepted answer of the question you linked to tailored to your schema and requirements:

    select   x.id,
             x.customerid, 
             x.dthrsale
        from sales x
        join (select customerid,
                     min(dthrsale) as first_sale
                from sales 
            group by customerid) p on p.customerid = x.customerid
                                  and p.first_sale = x.dthrsale
    order by x.id
    

    The order by is not necessary, I just added it to make it give the order as shown in your question.

    With Firebird 3 you can use the window function ROW_NUMBER which is also described in the linked answer. The linked answer incorrectly said the first solution would work on Firebird 2.1 and higher. I have now edited it.

    0 讨论(0)
提交回复
热议问题