2013-10-03 4 views

ответ

1

Я не совсем уверен, что ограничения здесь (например, вы можете иметь более двух записей с кодом = ? 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 
+0

Да, вы можете и будет иметь более 2 записей .. Я дам, что попробовать – user1683987

+0

этот запрос ничего не предполагать о количестве записей в коде, но если вы можете уточнить свой вопрос и что именно вы пытаетесь достичь, вам будет проще предоставить вам правильный ответ. – Mureinik

+0

Он работает только для этих двух записей, но не работает для всех кодов в этой таблице, так как это используя мин., макс. Отличная попытка, хотя, спасибо – user1683987

1

чтобы упростить ответ, это помогло бы знать, если есть образцы/обобщения можно сделать, о дубликатах.

(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

+0

Я отредактировал код под пунктом (2): взял дополнительную запятую из первого SELECT, добавил «ORDER BY» в конец первого SELECT и исправил имена столбцов во втором SELECT, чтобы использовать только columnName «H_T " один раз. –

Смежные вопросы