Jako pierwszy krok, można użyć UNPIVOT
:
SELECT Id, [Column Name], Columns
FROM
(SELECT Id, Age, Banksaldo, [Number of children]
FROM mytable) p
UNPIVOT
(Columns FOR [Column Name] IN (Age, Banksaldo, [Number of children])
)AS unpvt
aby uzyskać następujący zestaw wyników:
Id Column Name Columns
--------------------------------
1 Age 27
1 Banksaldo 2000
1 Number of children 5
2 Age 30
2 Banksaldo 3000
2 Number of children 2
Użycie ROW_NUMBER
dla powyższej tabeli pochodnej w celu zlokalizowania rekordów min/maks:
SELECT Id, [Column Name], Columns,
ROW_NUMBER() OVER (PARTITION BY [Column Name]
ORDER BY Columns) AS minRn,
ROW_NUMBER() OVER (PARTITION BY [Column Name]
ORDER BY Columns DESC) AS maxRn
FROM (
... unpivot query here ...
) t
Wyjście z góry:
Id Column Name Columns minRn maxRn
-----------------------------------------------
2 Age 30 2 1
1 Age 27 1 2
2 Banksaldo 3000 2 1
1 Banksaldo 2000 1 2
1 Number of children 5 2 1
2 Number of children 2 1 2
W końcowym etapie, można użyć agregacji warunkową na minRn
, maxRn
do uzyskania wymaganej zestaw wyników:
SELECT [Column Name],
MAX(CASE WHEN minRn = 1 THEN Id END) AS [Minimum Id],
MAX(CASE WHEN minRn = 1 THEN Columns END) AS [Minimum],
MAX(CASE WHEN maxRn = 1 THEN Id END) AS [Maximum Id],
MAX(CASE WHEN maxRn = 1 THEN Columns END) AS [Maximum]
FROM (
SELECT Id, [Column Name], Columns, minRn, maxRn
FROM (
SELECT Id, [Column Name], Columns,
ROW_NUMBER() OVER (PARTITION BY [Column Name]
ORDER BY Columns) AS minRn,
ROW_NUMBER() OVER (PARTITION BY [Column Name]
ORDER BY Columns DESC) AS maxRn
FROM (
SELECT Id, [Column Name], Columns
FROM
(SELECT Id, Age, Banksaldo, [Number of children]
FROM mytable) p
UNPIVOT
(Columns FOR [Column Name] IN (Age, Banksaldo, [Number of children])
)AS unpvt) t
) s
WHERE s.minRn = 1 OR s.maxRn = 1) u
GROUP BY [Column Name]
SQL Fiddle Demo
http://stackoverflow.com/questions/1979046/sql-query-minimum-maximum odpowiedź Marka mogą być wykorzystane do – Hypaethral
sprawdzić moją odpowiedź. Jest prosty i wydajny. – Stephan