Как избежать дублирования значений - PullRequest
0 голосов
/ 27 февраля 2012

Table1

ID  fromdate   todate

001 23/02/2012 27/02/2012
002 23/02/2012 27/02/2012
003 28/02/2012 09/09/2013
....

Условие: я не хочу показывать повторяющиеся значения, поэтому проверка даты с другой датой с даты, если она равна, не должна повторяться, проверка даты с другой датой, если она равна, дата не должна повторяться ,

Ожидаемый результат

ID  fromdate   todate

001 23/02/2012 27/02/2012
003 28/02/2012 09/09/2013
....

Исходя из вышеприведенного вывода, 002 не отображается, потому что fromdate и todate совпадают с 001, поэтому сравнение с датой не должно повторяться.

Как написать запрос для вышеуказанного условия?

Ответы [ 4 ]

4 голосов
/ 27 февраля 2012

Попробуйте это:

SELECT MIN(ID), fromDate, toDate FROM table
GROUP BY fromDate, toDate
2 голосов
/ 27 февраля 2012

A ROW_NUMBER решение было бы проще написать, но следующие работы с SQL Server 2000.

В двух словах

  • получить все самые низкие fromdates в подвыборке
  • получить все самые низкие todates в подвыборке для оставшихся самых низких fromdates на JOINING с нашей предыдущей выборкой.
  • получить все записи из фактической таблицы для оставшихся todates на JOINING с нашей предыдущей выборкой.

Оператор SQL

SELECT  Table1.*
FROM    Table1
        INNER JOIN (
          SELECT  ID = MIN(Table1.ID), todate
          FROM    Table1
                  INNER JOIN (
                    SELECT  ID = MIN(ID), fromdate
                    FROM    Table1
                    GROUP BY
                            fromdate
                  ) UniqueFromDates ON UniqueFromDates.ID = Table1.ID
          GROUP BY
                  todate        
        ) UniqueToDates ON UniqueToDates.ID = Table1.ID                  
1 голос
/ 27 февраля 2012

из ваших комментариев, если "с и до сегодняшнего дня сравнение не должно повторяться" - это ваше требование, оно очень просто

В случае, если есть несколько "ID" с одинаковыми данными и датой, и вы хотите покажите ПЕРВЫЙ ID , затем используйте это

  select MIN(id) id,fromdata, todate from tablename group by fromdata, todate

В случае, если есть несколько "ID" с одинаковыми данными и датой, и вы хотите показать LAST ID , затем используйтеэто

  select MAX(id) id,fromdata, todate from tablename group by fromdata, todate
0 голосов
/ 27 февраля 2012

Вы также можете использовать PARTITION BY как ↓

SELECT id,
       fromdate,
       todate
FROM   (SELECT id,
               fromdate,
               todate,
               Row_number() OVER (PARTITION BY fromdate, todate ORDER BY id) AS
               row
        FROM   table) t
WHERE  t.row = 1  
...