Подтвердить что ты не робот

Получите первую первую запись из повторяющихся записей, не имеющих уникальной идентификации

Мне нужно получить верхнюю первую строку из каждого дублированного набора записей из таблицы, приведенной ниже. Мне нужно использовать этот запрос в виду

пожалуйста, не используйте временную таблицу, так как я уже сделал это, добавив столбец идентификаторов, функцию min и группировку по. Мне нужно решение без временной таблицы или табличной переменной

Это просто пример данных. Оригинал имеет 1000 записей в таблице, и мне нужно просто результат из первой 1000, поэтому не могу использовать различные

Я использую SQL Server 2005

alt text

Благодарю.

4b9b3361

Ответ 1

Ответ зависит конкретно от того, что вы подразумеваете под "1000 наивысшими" записями.

Если вы имеете в виду, что хотите вернуть не более 1000 различных записей, независимо от количества дубликатов в таблице, напишите это:

SELECT DISTINCT TOP 1000 id, uname, tel
FROM Users
ORDER BY <sort_columns>

Если вы хотите только искать первые 1000 строк в таблице и потенциально возвращать гораздо меньше 1000 различных строк, тогда вы должны записать его с помощью подзапроса или CTE, например:

SELECT DISTINCT *
FROM
(
    SELECT TOP 1000 id, uname, tel
    FROM Users
    ORDER BY <sort_columns>
) u

ORDER BY, конечно, необязательно, если вы не заботитесь о том, какие записи вы возвращаете.

Ответ 2

Найти все товары, заказанные 1 или более раз... (вид дубликатов записей)

SELECT DISTINCT * from [order_items] where productid in 
(SELECT productid 
  FROM [order_items]
  group by productid 
  having COUNT(*)>0)
order by productid 

Чтобы выбрать последний вставленный из них...

SELECT DISTINCT productid, MAX(id) OVER (PARTITION BY productid) AS LastRowId from [order_items] where productid in 
(SELECT productid 
  FROM [order_items]
  group by productid 
  having COUNT(*)>0)
order by productid 

Ответ 3

Иногда вы можете использовать оператор CROSS APPLY следующим образом:

select distinct result.* from data d
cross apply (select top 1 * from data where data.Id = d.Id) result

В этом запросе мне нужно выбрать только первый из многих дубликатов, которые, естественно, происходят в моих данных. Он работает с базами данных SQL Server 2005+.

Ответ 4

Помогает ли SELECT DISTINCT? Я предполагаю, что он вернет результат, который вы хотите.

Ответ 5

Использование DISTINCT должно сделать это:

SELECT DISTINCT id, uname, tel
FROM YourTable

Хотя вы действительно можете сделать с первичным ключом на этой таблице, способ уникальной идентификации каждой записи. Я бы подумал о том, чтобы вставить столбец IDENTITY в таблицу

Ответ 6

Лучше всего установить фиктивный дизайн и добавить столбец identoty в таблицу. Почему у вас есть стол без одного в первую очередь? Особенно с дублирующимися записями! Очевидно, что сама база данных нуждается в перепроектировании.

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

Ответ 7

Вы можете попробовать следующее:

  • Создайте представление, которое просто выбирает все столбцы из исходной таблицы, но добавляет дополнительный числовой столбец, увеличивающий значение с каждой записью \row. Возможно, вам понадобится сделать этот столбец не целочисленным (например, десятичным и увеличить его на 1.00 для каждой записи, чтобы использовать его в SQL-запросе RANK()).

  • Также добавьте другой столбец (например, "RecordRank" ), чтобы содержать рассчитанные ранжированные значения для всех столбцов, используя предложение RANK() OVER SQL, чтобы создать значения для этого столбца - см. ссылки ниже. Оператор RANK позволяет разделить записи и затем упорядочить записи каждого раздела в соответствии со значениями в порядке по столбцу (используйте столбец с возрастающими значениями с шага 1 для вашего заказа). Вы используете столбцы с идентичными данными в предложении раздела, чтобы все похожие дубликаты были разбиты на разделы или сгруппированы вместе, а затем упорядочены по значениям в дополнительном столбце (по порядку по столбцу с шага 1).

    http://msdn.microsoft.com/en-us/library/ms189461.aspx

3, После успешного создания вышеуказанного представления просто напишите другое представление, чтобы выбрать только записи с 'RecordRank' = 1

Это должно выбрать только одну из каждой записи из дубликатов или разделов.

Надеюсь, что это поможет - malcom sankoh

Ответ 8

Вот два решения, я использую Oracle SQL server:

1), используя оператор over:

    with org_table as
 (select 1 id, 'Ali' uname
    from dual
  union
  select 1, 'June'
    from dual
  union
  select 2, 'Jame'
    from dual
  union
  select 2, 'July' from dual)
select id, uname
  from (select a.id,
               a.uname,
               ROW_NUMBER() OVER(PARTITION BY a.id ORDER BY a.id) AS freq

          from org_table a)
 where freq = 1

2) Использование подзапроса:

    with org_table as
 (select 1 id, 'Ali' uname
    from dual
  union
  select 1, 'June'
    from dual
  union
  select 2, 'Jame'
    from dual
  union
  select 2, 'July' from dual)

select a.id,
       (select b.uname
          from org_table b
         where b.id = a.id
           and rownum = 1)
  from (select distinct id from org_table) a