пример:Как присоединяться к повторяющейся строке, чтобы показать как одну строку?
Code T_ID
12345 1
12345 2
Я хотел бы вернуться в следующем:
Code H_T A_T
12345 1 2
пример:Как присоединяться к повторяющейся строке, чтобы показать как одну строку?
Code T_ID
12345 1
12345 2
Я хотел бы вернуться в следующем:
Code H_T A_T
12345 1 2
Я не совсем уверен, что ограничения здесь (например, вы можете иметь более двух записей с кодом = ? 12 345), но попробовать это для размера:
SELECT code, h_t, a_t
FROM (SELECT code, MIN(t_id) AS h_t
FROM some_table
GROUP BY code) mins,
(SELECT code, MAX(t_id) AS a_t
FROM some_table
GROUP BY code) maxs
WHERE mins.code = maxs.code
чтобы упростить ответ, это помогло бы знать, если есть образцы/обобщения можно сделать, о дубликатах.
(1) В вашем примере показан только один дубликат. Является ли это представителем, или это когда-либо более, чем 1 дублировать? Если только один дубликат возможно, то самое простое решение было бы без JOIN ... просто GROUP BY:
SELECT Code
,H_T = MIN(T_ID)
,A_T = MAX(T_ID)
FROM <tableName> (NOLOCK)
GROUP BY Code
(2) Ваш пример показывает последовательные натуральные числа, начиная с 1. Всегда ли они начинаются с 1 ? Всегда ли они подряд? Как высоко они могут идти?
(Любые действительные обобщения, как это позволило бы упростить код ... возможно, проще, чем ниже.)
Например, если мы предположим, что дубликаты не последовательны и не всегда начинаются с 1, но мы также предполагаем, что нам нужно сообщить только дубликаты, , затем мы можем ввести ROW_NUMBER (который будет последовательным и начинаться с 1), а затем ссылаться на это.
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'zz_DupsReport_table1')
DROP TABLE dbo.zz_DupsReport_table1
SELECT R_NUM = ROW_NUMBER()
OVER(PARTITION BY Code
ORDER BY T_ID)
,Code
,T_ID
INTO dbo.zz_DupsReport_table1
FROM <tableName> (NOLOCK)
ORDER BY Code, T_ID
SELECT Code
,H_T = T01.T_ID
,A_T = T02.T_ID
,B_T = T03.T_ID
,C_T = T04.T_ID
,D_T = T05.T_ID
,E_T = T06.T_ID
,F_T = T07.T_ID
,G_T = T08.T_ID
,I_T = T09.T_ID
,J_T = T10.T_ID
,Over10found = CASE WHEN Txx.Code IS NULL THEN 'N' ELSE 'Y' END
FROM <tableName> ORIG (NOLOCK)
LEFT OUTER JOIN dbo.zz_DupsReport_table1 T01 (NOLOCK)
ON T01.Code = ORIG.Code AND T01.R_NUM = 1
LEFT OUTER JOIN dbo.zz_DupsReport_table1 T02 (NOLOCK)
ON T02.Code = ORIG.Code AND T02.R_NUM = 2
LEFT OUTER JOIN dbo.zz_DupsReport_table1 T03 (NOLOCK)
ON T03.Code = ORIG.Code AND T03.R_NUM = 3
LEFT OUTER JOIN dbo.zz_DupsReport_table1 T04 (NOLOCK)
ON T04.Code = ORIG.Code AND T04.R_NUM = 4
LEFT OUTER JOIN dbo.zz_DupsReport_table1 T05 (NOLOCK)
ON T05.Code = ORIG.Code AND T05.R_NUM = 5
LEFT OUTER JOIN dbo.zz_DupsReport_table1 T06 (NOLOCK)
ON T06.Code = ORIG.Code AND T06.R_NUM = 6
LEFT OUTER JOIN dbo.zz_DupsReport_table1 T07 (NOLOCK)
ON T07.Code = ORIG.Code AND T07.R_NUM = 7
LEFT OUTER JOIN dbo.zz_DupsReport_table1 T08 (NOLOCK)
ON T08.Code = ORIG.Code AND T08.R_NUM = 8
LEFT OUTER JOIN dbo.zz_DupsReport_table1 T09 (NOLOCK)
ON T09.Code = ORIG.Code AND T09.R_NUM = 9
LEFT OUTER JOIN dbo.zz_DupsReport_table1 T10 (NOLOCK)
ON T10.Code = ORIG.Code AND T10.R_NUM = 10
LEFT OUTER JOIN (SELECT DISTINCT Code
FROM dbo.zz_DupsReport_table1 SUBQ (NOLOCK)
WHERE SUBQ.R_NUM > 10
) AS Txx
ON Txx.Code = ORIG.Code
(3) Если вы хотите неограниченное количество дублей (и, следовательно, непредсказуемое число столбцов), вы могли бы получить в рекурсии и/или создать свой ВЫБРАТЬ в виде строки, выполняется с использованием EXEC. Если это так, скажем так, и я могу дать более подробную информацию.
Надежда, что помогает, --Doug
Я отредактировал код под пунктом (2): взял дополнительную запятую из первого SELECT, добавил «ORDER BY» в конец первого SELECT и исправил имена столбцов во втором SELECT, чтобы использовать только columnName «H_T " один раз. –
Да, вы можете и будет иметь более 2 записей .. Я дам, что попробовать – user1683987
этот запрос ничего не предполагать о количестве записей в коде, но если вы можете уточнить свой вопрос и что именно вы пытаетесь достичь, вам будет проще предоставить вам правильный ответ. – Mureinik
Он работает только для этих двух записей, но не работает для всех кодов в этой таблице, так как это используя мин., макс. Отличная попытка, хотя, спасибо – user1683987