Preciso armazenar um grande número de datas , juntamente com um preço que corresponda a cada data . Estou considerando duas opções: uma é (a) armazenar uma linha para cada par de data e preço ; o outro é (b) armazenar uma linha com intervalo de datas e preço . Por exemplo:
Opção A. Uma tabela que armazena datas individuais
CREATE TABLE Foo
(
ID INT,
Date SMALLDATETIME,
Price DECIMAL
);
Opção b . Uma tabela que armazena intervalos de datas
CREATE TABLE Bar
(
ID INT,
RangeStart SMALLDATETIME,
RangeEnd SMALLDATETIME,
Price DECIMAL
);
A opção (b) é realmente uma boa ideia? A principal razão para isso é diminuir o número de linhas INSERTed. Nesse caso, se um preço for o mesmo durante um ano eu teria, por exemplo:
ID RangeStart RangeEnd Price
-- ---------- ---------- -----
1 2017-01-01 2017-12-31 100
ao invés de
ID RangeStart Price
--- ---------- -----
1 2017-01-01 100
2 2017-01-02 100
...........................
365 2017-12-31 100
Existe realmente uma necessidade disso, já que haveria uma sobrecarga adicional de conversão de intervalos de datas em datas quando usado em uma camada de negócios do programa aplicativo?
Eu uso apenas uma data, a data em que o preço entrou em vigor. Esse preço permanece em vigor até que o preço mude. Portanto, se um preço mudar raramente, haverá poucos registros; se o preço mudar com frequência, haverá muitos registros.
A consulta retornará o preço atual, 90, todos os dias em que for executada neste ano. Após o Ano Novo, retornará o novo preço atual, 100.
A consulta acima faz a pergunta: "Qual é o preço atual do item 17?" Para fazer a pergunta "Qual era/será o preço do item 17 em uma determinada data?" basta substituir "Today ()" pela data.
Por exemplo, para ver qual será a data em 1º de janeiro de 2017:
Obviamente, usar uma variável em vez de codificar a data forneceria uma única consulta que forneceria o preço a qualquer momento no passado, no presente ou no futuro.
Sim, permite manter histórico dos preços dos produtos. Isso permite relatórios e métricas (usados pelo marketing) para identificar o preço pelo qual um produto vendeu bem e vendeu mal.
É semelhante a ter as colunas HIRE_DATE e TERM_DATE de um funcionário. Você não deseja apenas excluir funcionários, especialmente para fins contábeis e fiscais. Fui recontratado no meu trabalho após um intervalo de 5 anos. Como temos colunas de data de contratação/período, eu (e o RH) podemos ver os dois períodos facilmente.
Com a Opção A, você não poderá rastrear as datas de um preço por mais de 2 revisões (pelo menos não intuitivamente).
Como alternativa à abordagem @TommCat, você também pode fazer sua seleção usar um ORDER BY e um LIMIT em vez de ter uma subconsulta para encontrar seu valor máximo. Com índices apropriados (aquele do PK serviria, eu acho), isso pode ser um pouco mais rápido: