Get oldest value from another table

1

I need to create a query that returns the oldest stock of each product within a specified period:

Tabela Produtos:

ID DESCRICAO
1  TOMATE
2  ABACAXI

Tabela Estoque:

DATA       HORA     PRODUTO  ESTOQUE 
01/01/2015 09:01:00 1        8
01/01/2015 10:05:15 1        7
01/01/2015 11:00:20 2        15

Should return something like:

Produto Estoque
1       8
2       15

I tried to create something like this:

select e.produto, s1.estoque from estoque e
  left outer join
  (select produto, e1.estoque
   Min(CAST(Right('0' + Cast(DayOfMonth(e1.data) as sql_varchar),2) + '/' + 
            Right('0' + Cast(Month(e1.data) as sql_varchar),2) + '/' + 
            Right('00' + Cast(Year(e1.data) as sql_varchar),4) + ' ' + 
            Trim(e1.Hora) AS SQL_TIMESTAMP)) as tempo
   from estmovd e1
   where e1.data between '10/01/2015' and '10/10/2015') s1 on s1.produto = e1.produto 
where e.data between '10/01/2015' and '10/10/2015'

But to no avail. Does anyone have any tips to help me?

Thank you

    
asked by anonymous 12.10.2015 / 05:58

2 answers

1

Thank you all for the help. I was able to resolve it as follows:

select e.produto, e.saldo from estoque e
where CAST(Right('00' + Cast(Year(e.data) as sql_varchar),4) + '-' +
            Right('0' + Cast(Month(e.data) as sql_varchar),2) + '-' +
            Right('0' + Cast(DayOfMonth(e.data) as sql_varchar),2) + ' ' + 
            Trim(e.Hora) AS SQL_TIMESTAMP ) =
(
    SELECT  MIN(CAST(Right('00' + Cast(Year(e.data) as sql_varchar),4) + '-' +
            Right('0' + Cast(Month(e.data) as sql_varchar),2) + '-' +
            Right('0' + Cast(DayOfMonth(e.data) as sql_varchar),2) + ' ' + 
            Trim(e.Hora) AS SQL_TIMESTAMP))
    FROM estoque e2
    WHERE e2.Produto = e.Produto
)           
    
14.10.2015 / 04:26
0

Opa,

I recommend you use a DATAHORA column together instead of DATE, TIME separated, in which case the test below works as you want:

CREATE TABLE #Produtos
(
    DATAHORA DateTime,
    PRODUTO int,
    ESTOQUE int
)

INSERT INTO #Produtos (DATAHORA, PRODUTO, ESTOQUE) VALUES ('01-01-2015 08:01:00', 1, 8)
INSERT INTO #Produtos (DATAHORA, PRODUTO, ESTOQUE) VALUES ('01-01-2015 09:05:15', 1, 7)
INSERT INTO #Produtos (DATAHORA, PRODUTO, ESTOQUE) VALUES ('01-01-2015 11:00:20', 2, 15)
INSERT INTO #Produtos (DATAHORA, PRODUTO, ESTOQUE) VALUES ('01-01-2015 10:00:15', 2, 5)

SELECT p.Produto, p.Estoque
FROM #Produtos p
WHERE p.DataHora =
(
    SELECT MIN(p2.DataHora)
    FROM #Produtos p2
    WHERE p2.Produto = p.Produto
)

DROP TABLE #Produtos

The example below uses separate DATE and TIME as in your table:

CREATE TABLE #Produtos
(
    DATA DateTime,
    HORA DateTime,
    PRODUTO int,
    ESTOQUE int
)

INSERT INTO #Produtos (DATA, HORA, PRODUTO, ESTOQUE) VALUES ('01-01-2015','08:01:00', 1, 8)
INSERT INTO #Produtos (DATA, HORA, PRODUTO, ESTOQUE) VALUES ('01-01-2015','09:05:15', 1, 7)
INSERT INTO #Produtos (DATA, HORA, PRODUTO, ESTOQUE) VALUES ('01-01-2015','11:00:20', 2, 15)
INSERT INTO #Produtos (DATA, HORA, PRODUTO, ESTOQUE) VALUES ('01-01-2015','10:00:15', 2, 5)

SELECT p.Produto, p.Estoque
FROM #Produtos p
WHERE (cast(p.Data as datetime) + cast(p.Hora as datetime)) =
(
    SELECT MIN(cast(p2.Data as datetime) + cast(p2.Hora as datetime))
    FROM #Produtos p2
    WHERE p2.Produto = p.Produto
)

DROP TABLE #Produtos
    
12.10.2015 / 08:35