T-SQL: возвращает переменное количество записей на основе верхнего значения в столбце - PullRequest
0 голосов
/ 14 марта 2012

Если у меня есть таблица:

+------------------------------------------------------------+
|  Col 1                                     Col 2    Col 3  |
+------------------------------------------------------------+
|  a72195fa-57ca-4849-b423-5595219c8f6b      Val1     1      |
|  a72195fa-57ca-4849-b423-5595219c8f6b      Val2     1      |
|  a72195fa-57ca-4849-b423-5595219c8f6b      Val3     2      |
|  a72195fa-57ca-4849-b423-5595219c8f6b      Val4     3      |
|  2F6D0B9E-2221-4D18-A64E-ACCFB83EACC7      Val5     2      |
|  2F6D0B9E-2221-4D18-A64E-ACCFB83EACC7      Val6     2      |
|  2F6D0B9E-2221-4D18-A64E-ACCFB83EACC7      Val7     3      |
+------------------------------------------------------------+

Для заданного значения Col 1, как вернуть все записи для наименьшего значения в Col3. То есть где [Col 1] = a72195fa-57ca-4849-b423-5595219c8f6b, я хочу вернуть:

+------------------------------------------------------------+
|  Col 1                                     Col 2    Col 3  |
+------------------------------------------------------------+
|  a72195fa-57ca-4849-b423-5595219c8f6b      Val1     1      |
|  a72195fa-57ca-4849-b423-5595219c8f6b      Val2     1      |
+------------------------------------------------------------+

И куда [Col 1] = 2F6D0B9E-2221-4D18-A64E-ACCFB83EACC7 я хочу вернуть:

+---------------------------------------------------------+
| Col 1                                   Col 2    Col 3  |
+---------------------------------------------------------+
| 2F6D0B9E-2221-4D18-A64E-ACCFB83EACC7    Val5     2      |
| 2F6D0B9E-2221-4D18-A64E-ACCFB83EACC7    Val6     2      |
+---------------------------------------------------------+

Ответы [ 4 ]

2 голосов
/ 14 марта 2012

Немного умнее (я думаю):

SELECT * INTO #TEMP
FROM
(
 SELECT 'a72195fa-57ca-4849-b423-5595219c8f6b' col1, 'Val1' col2, 1 col3
UNION SELECT 'a72195fa-57ca-4849-b423-5595219c8f6b' col1, 'Val2' col2, 1 col3
UNION SELECT 'a72195fa-57ca-4849-b423-5595219c8f6b' col1, 'Val3' col2, 2 col3
UNION SELECT 'a72195fa-57ca-4849-b423-5595219c8f6b' col1, 'Val4' col2, 3 col3
UNION SELECT '2F6D0B9E-2221-4D18-A64E-ACCFB83EACC7' col1, 'Val5' col2, 2 col3
UNION SELECT '2F6D0B9E-2221-4D18-A64E-ACCFB83EACC7' col1, 'Val6' col2, 2 col3
UNION SELECT '2F6D0B9E-2221-4D18-A64E-ACCFB83EACC7' col1, 'Val7' col2, 3 col3
) A

SELECT * FROM #TEMP

SELECT *
FROM
(
 SELECT *
 , RANK() OVER(PARTITION BY col1 ORDER BY col3 ASC) _RANK
 FROM #TEMP
) a
WHERE a._RANK = 1
2 голосов
/ 14 марта 2012
SELECT A.*
FROM TABLE A,
(
SELECT Col1,MIN(Col3) AS Col3
FROM TABLE
GROUP BY Col1
) B
WHERE A.Col3=B.Col3;
1 голос
/ 14 марта 2012

Вот один из способов использования подзапроса:

SELECT *
FROM myTable
WHERE Col3 = (SELECT MIN(Col3) FROM myTable WHERE Col1 = @SomePassedInGuid)
AND Col1 = @SomePassedInGuid
0 голосов
/ 14 марта 2012

Вот, в сущности, тот же вопрос, который дал Ли, выраженный немного более компактно.

select top (1) with ties
  Col1, Col2, Col3
from T
order by rank() over (
  partition by Col1
  order by Col3
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...