Если вы не можете убежать от *
, тогда вы не можете GROUP BY
, и если у вас просто есть WHERE
, тогда вам понадобится ключ (уникальный набор столбцов), чтобы можно было правильно фильтроватьили вы не можете различать дубликаты (и в итоге выбираете более 1 строки с одним и тем же именем клиента).
Это немного запутанно, но попробуйте это.Он будет получать по 1 строке на каждую CUSTOMER_NAME
.
SELECT
*
from
[iData3].[dbo].[N241650]
where
[N241650].KeyColumn IN
(
SELECT
Z.KeyColumn
FROM
(
SELECT
X.KeyColumn,
Ranking = ROW_NUMBER() OVER (PARTITION BY X.CUSTOMER_NAME ORDER BY X.KeyColumn ASC)
FROM
[iData3].[dbo].[N241650] AS X
WHERE
X.KeyColumn IS NOT NULL
) AS Z
WHERE
Z.Ranking = 1
)
ORDER BY
внутри OVER
будет определять, какую строку вы получите для каждой CUSTOMER_NAME
.
Если выиметь несколько столбцов для вашего ключа, тогда вам придется переключить IN
для EXISTS
для нескольких столбцов (вы не можете сделать несколько столбцов IN
в SQL Server).
SELECT
*
from
[iData3].[dbo].[N241650]
where
EXISTS (
SELECT
'key columns match'
FROM (
SELECT
X.KeyColumn1,
X.KeyColumn2,
Ranking = ROW_NUMBER() OVER (PARTITION BY X.CUSTOMER_NAME ORDER BY X.KeyColumn1 ASC)
FROM
[iData3].[dbo].[N241650] AS X
) AS Z
WHERE
Z.Ranking = 1 AND
[N241650].KeyColumn1 = Z.KeyColumn1 AND
[N241650].KeyColumn2 = Z.KeyColumn2
)