J'ai quelques prix pour le mois de janvier.
price,from,to 100,1,7 115,3,3 120,4,10
3 Réponses :
Ceci est un problème de lacunes et de îles. La solution la plus simple est la différence de numéros de ligne: pourquoi cette fonction est un peu difficile à expliquer. Mais si vous regardez les résultats de la sous-requête, vous verrez comment les lignes adjacentes sont identifiées par la différence entre les deux valeurs. P> p>
Merci Gordon. problème a été résolu. Compris la logique sur la façon dont cela a fonctionné.
SELECT Lag.price,Lag.[date] AS [From], MIN(Lead.[date]-Lag.[date])+Lag.[date] AS [to]
FROM
(
SELECT [date],[Price]
FROM
(
SELECT [date],[Price],LAG(Price) OVER (ORDER BY DATE,Price) AS LagID FROM #table1 A
)B
WHERE CASE WHEN Price <> ISNULL(LagID,1) THEN 1 ELSE 0 END = 1
)Lag
JOIN
(
SELECT [date],[Price]
FROM
(
SELECT [date],Price,LEAD(Price) OVER (ORDER BY DATE,Price) AS LeadID FROM [#table1] A
)B
WHERE CASE WHEN Price <> ISNULL(LeadID,1) THEN 1 ELSE 0 END = 1
)Lead
ON Lag.[Price] = Lead.[Price]
WHERE Lead.[date]-Lag.[date] >= 0
GROUP BY Lag.[date],Lag.[price]
ORDER BY Lag.[date]
Une autre méthode utilisant des rangées non fondées précédentes
J'ai supprimé les balises de base de données incohérentes de la question. Veuillez baliser uniquement avec la base de données que vous utilisez vraiment.
"J'ai besoin de faire cela en utilisant SQL uniquement" i> Eve4ry RDBMS utilise une dialecte différente de SQL, il n'y a pas de solution "SQL uniquement", car il pourrait bien être spécifique aux SJB que vous utilisez. Qu'avez-vous essayé jusqu'à présent, et pourquoi cela n'a-t-il pas fonctionné?