On ne sait pas très bien ce que vous voulez de votre question. Voulez-vous vraiment le code d'identification GROUP BY? Sinon, c'est assez simple et vous avez déjà beaucoup de réponses. Mais si vous voulez GROUP BY alors c'est plus difficile et personne ne l'a encore tout à fait raison. Je suppose également que vous ne voulez qu'une ligne par indicateur, et s'il y a des lignes dupliquées qui ont la même valeur max/min, il est préférable de simplement en choisir une arbitrairement au lieu de retourner les deux.
Voilà ma tentative, en utilisant CTEs (nécessite SQL Server 2005 ou plus récent):
WITH
RowNumbers AS (
SELECT ROW_NUMBER() OVER (ORDER BY indicatorid, value) AS RowNumber, *
FROM [AnalystEstimates].[dbo].[AnalystEstimateValues]),
MinRowNumbers AS (
SELECT indicatorid, MIN(RowNumber) AS RowNumber FROM RowNumbers GROUP BY indicatorid),
MaxRowNumbers AS (
SELECT indicatorid, MAX(RowNumber) AS RowNumber FROM RowNumbers GROUP BY indicatorid)
SELECT
MinRowNumbers.indicatorid,
RN1.Value AS MinValue,
RN1.ID AS MinValueId,
RN2.Value AS MaxValue,
RN2.ID AS MaxValueId
FROM MinRowNumbers
JOIN MaxRowNumbers ON MinRowNumbers.indicatorid = MaxRowNumbers.indicatorid
JOIN RowNumbers RN1 ON MinRowNumbers.RowNumber = RN1.RowNumber
JOIN RowNumbers RN2 ON MaxRowNumbers.RowNumber = RN2.RowNumber
Voici quelques données que je l'habitude de le tester:
CREATE TABLE AnalystEstimateValues (ID int, indicatorid int, Value int);
INSERT INTO AnalystEstimateValues (ID, indicatorid , Value) VALUES
(1, 1, 4),
(2, 1, 4),
(3, 2, 6),
(4, 1, 2),
(5, 2, 2),
(6, 2, 5),
(7, 3, 0);
Et voici la sortie que je reçois:
indicatorid MinValue MinValueId MaxValue MaxValueId
1 2 4 4 2
2 2 5 6 3
3 0 7 0 7
Si ce n'est pas ce que vous voulez, pouvez-vous s'il vous plaît essayer d'améliorer votre question pour nous dire ce que vous voulez?
Mise à jour: Voici une solution alternative basée sur la réponse de Craig jeune mais avec des jointures au lieu de sous-requêtes:
WITH
UniqueIds AS (
SELECT IndicatorId, Value, MIN(id) AS Id
FROM AnalystEstimateValues
GROUP BY IndicatorId, Value)
SELECT
lims.IndicatorId,
MinValue,
T1.Id AS MinValueId,
MaxValue,
T2.Id AS MaxValueId
FROM (
SELECT
IndicatorId,
MIN(Value) as MinValue,
MAX(Value) as MaxValue
FROM AnalystEstimateValues
GROUP BY IndicatorId) lims
JOIN UniqueIds T1 ON lims.IndicatorId = T1.IndicatorId AND lims.MinValue = T1.Value
JOIN UniqueIds T2 ON lims.IndicatorId = T2.IndicatorId AND lims.MaxValue = T2.Value
C'est plus propre et probablement aussi plus rapide que ma première version, bien que je ne l'ai pas courir tests de performance pour vérifier cela.
Avez-vous besoin de l'ID et MIN, puis l'ID et Max. En 2 rangs? à côté de l'autre? –
oui ce serait cool si ID et MIN, puis l'ID et Max sont les uns à côté des autres – Woland
@Woland: Pourriez-vous modifier votre question pour refléter l'exigence modifiée? –