Запрос на возврат 1 экземпляра записи с дубликатами - PullRequest
2 голосов
/ 04 апреля 2009

ИНФОРМАЦИЯ: Я работаю с Microsoft SQL.
Хорошо, название озадачивает, но вот пример таблицы, с которой я работаю:

ID    Value    Signal    Read    Firmware    Date           Time
5     123      656       444       217       3/30/2009     11:00:00 AM
5     123      421       333       217       3/30/2009     04:00:00 PM
5     123      111       666       217       3/30/2009     05:00:00 PM
9     321      231       551       216       3/30/2009     09:00:00 AM
9     321      599       887       216       3/30/2009     09:30:00 AM

Итак, я хочу, чтобы запрос вернулся:

ID    Value    Signal    Read    Firmware    Date           Time
5     123      111       666       217       3/30/2009     05:00:00 PM
9     321      599       887       216       3/30/2009     09:30:00 AM

Я пробовал:

SELECT DISTINCT ID, Value, Signal, Read, Firmware, Date, Time FROM ....

Но это возвращает все результаты. Я также попробовал SELECT TOP 1 ... но я не мог заставить это работать. Я знаю, что это просто, но я не совсем понимаю, как заставить это отображать только 1 уникальную строку Спасибо за помощь.

Ответы [ 6 ]

8 голосов
/ 04 апреля 2009

Вы пробовали это?

SELECT id, value, MIN(Signal), MIN(Read), MIN(Firmware), MIN(Date), MIN(Time)
FROM
  ...
GROUP BY
  ID, Value
1 голос
/ 04 апреля 2009

Записи различны , существуют разные значения Signal, Read и Time. Как вы ожидаете, что сервер SQL будет угадывать, какой сервер вам нужен?

Ваш пример показывает, что вас интересует самая последняя запись данного Id. Если это правда, этот запрос должен работать для вас:

SELECT table.*
FROM table
JOIN (SELECT Id, Date, MIN(Time) FROM Table GROUP BY Id, Date) AS selector
ON (table.Id = selector.Id AND table.Date = selector.Date and table.Time = selector.Time)
1 голос
/ 04 апреля 2009
SELECT
  ID, Value, Signal, Read, Firmware, Date, Time
FROM
  ...
GROUP BY
  ID, Value
0 голосов
/ 04 апреля 2009

Аналогичный запрос (использует CROSS APPLY и коррелированный подзапрос w / TOP WITH TIES):

SELECT

        a.CustodianAccountNum,

        a.AccountName,

        a.AccountName2,

        a.AccountName3,

        a.AccountStartDate,

        a.AccountClosedDate,

        a.TaxableFederal,

        a.TaxableState,

        qq.ValuationDate,

        qq.MarketValue,

        cg.ClientGroupGUID as ClientGUID,

        c.ClientGUID as EntityGUID,

        convert (bit, case when b.cnt > 1 then 1 else 0 end) as IsDuplicate 



  FROM (

        SELECT      

              a.CustodianAccountNum,

              MIN(a.AccountID) as AccountID,

              count(*) as cnt

        FROM Accounts a



        WHERE

              a.AccountID in (SELECT AccountID from dbo.FnGetFilteredAccountIDs(@CurrentUserID)) -- apply permisssions

              and a.DeletedDate is null



        group by a.CustodianAccountNum

  ) b

  INNER JOIN Accounts a

  ON

        a.AccountID = b.AccountID



  INNER JOIN ClientAccounts ca

  ON

        a.AccountID = ca.AccountID

        and ca.DeletedDate is null

  INNER JOIN Clients c

  ON

        ca.ClientID = c.ClientID

        and c.DeletedDate is null



  INNER JOIN ClientGroups cg

  ON

        c.ClientGroupID = cg.ClientGroupID 

        and cg.DeletedDate is null

  CROSS APPLY 

  (

        SELECT 

              SUM(MarketValue) as MarketValue, 

              MIN(ValuationDate) as ValuationDate 

        FROM

              (SELECT TOP 1 WITH TIES arv.MarketValue, arv.ValuationDate 

              FROM AccountReturnValues arv 

              where 

                    arv.AccountId = a.AccountId 

                    and a.AccountClosedDate is null

              order by ValuationDate desc

              ) q

  ) qq
0 голосов
/ 04 апреля 2009

использовать ТОП 1 с галстуками

0 голосов
/ 04 апреля 2009
SELECT Id, Value, Signal, Read, Firmware, Date, Time FROM table_name t1 WHERE t1.Id = (SELECT DISTINCT t2.Id FROM table_name t2)

Предполагается, что есть проверка, чтобы записи с одинаковым Id также имели одинаковое значение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...