You could use a stored procedure

SET TERM ^ ;
CREATE OR ALTER PROCEDURE CONSECUTIVE_DAYS (ipITEMNUMBER CHAR(3))
  RETURNS (opDATEFROM DATE, opDATETO DATE, opCONSECUTIVEDAYS INTEGER)
AS
  DECLARE VARIABLE vItem CHAR(3);
  DECLARE VARIABLE vDate DATE;
BEGIN
  opCONSECUTIVEDAYS = 0;

  -- get latest day used or pass in as parameter
  SELECT FIRST 1 DATEUSED
  FROM ITEM_USED
  WHERE ITEMNR = :ipITEMNUMBER
  ORDER BY DATEUSED DESC
  INTO :opDATETO;

  FOR
    SELECT ITEMNR, DATEUSED
    FROM ITEM_USED
    WHERE ITEMNR = :ipITEMNUMBER
    GROUP BY ITEMNR, DATEUSED
    ORDER BY DATEUSED DESC
    INTO :vItem, :vDate
  DO
  BEGIN
    IF (vDate = opDATEFROM -1) THEN
      opCONSECUTIVEDAYS = opCONSECUTIVEDAYS + 1;

    IF (vDate < opDATEFROM -1) THEN
      BREAK;

    opDATEFROM = vDate;
  END

  IF ((opCONSECUTIVEDAYS > 0) OR ((opDATEFROM = opDATETO) AND (opDATEFROM
IS NOT NULL))) THEN
    opCONSECUTIVEDAYS= opCONSECUTIVEDAYS + 1;

  SUSPEND;
END ^

SET TERM ; ^

SELECT opDATEFROM, opDATETO, opCONSECUTIVEDAYS
FROM CONSECUTIVE_DAYS ('abc');


On 2 March 2017 at 17:36, 'Stef' [email protected] [firebird-support] <
[email protected]> wrote:

>
>
> Good day,
>
> I have a question for you SQL boffins, how can I query a table to get the
> count of consecutive days found ?
>
> A Table contains rows with dates where an item(s) has been added for every
> day this item was used.
>
> i.e.
>
> itemnr dateused
>
> abc 2017/02/01
>
> abc 2017/02/02
>
> abc 2017/02/25
>
> abc 2017/02/25
>
> abc 2017/02/25
>
> abc 2017/02/26
>
> abc 2017/02/27
>
> abc 2017/02/28
>
> abc 2017/03/01
>
> abc 2017/03/02
>
> The result from above sample should be 6 as there is a break between
> 2017/02/02 and 2017/02/25?
>
> Regards
>
> Stef
>
> [Non-text portions of this message have been removed]
>
> 
>

Reply via email to