Using:
SELECT x.* FROM (SELECT s.*, ROW_NUMBER() OVER(PARTITION BY s.fk ORDER BY s.pk) rnk FROM YOUR_TABLE s) x WHERE x.rnk = 1
... or using CTE (no difference in performance):
WITH example AS ( SELECT s.*, ROW_NUMBER() OVER(PARTITION BY s.fk ORDER BY s.pk) rnk FROM sample s) SELECT x.* FROM example x WHERE x.rnk = 1
Evidence:
WITH sample AS ( SELECT 1 AS PK, 11 AS FK, 'A' AS [TYPE] UNION ALL SELECT 2 AS PK, 11 AS FK, 'B' AS [TYPE] UNION ALL SELECT 3 AS PK, 12 AS FK, 'B' AS [TYPE] UNION ALL SELECT 4 AS PK, 13 AS FK, 'C' AS [TYPE] UNION ALL SELECT 5 AS PK, 13 AS FK, 'D' AS [TYPE] UNION ALL SELECT 6 AS PK, 14 AS FK, 'D' AS [TYPE]) SELECT x.* FROM (SELECT s.*, ROW_NUMBER() OVER(PARTITION BY s.fk ORDER BY s.pk) rnk FROM sample s) x WHERE x.rnk = 1
Result:
pk fk type
source share