Выбор уникальных значений вне подстроки - PullRequest
0 голосов
/ 29 марта 2012

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

Select ID from table where ID in (Select distinct ID, Card, PunchTime, PunchDate)

Хотя это, очевидно, не работает. Я хочу получить идентификаторы, которые являются уникальными со всеми этими полями в качестве критериев. Я не могу придумать синтаксис, который работает. Я не уверен, что еще я могу сказать об этом, кажется, мне должно быть просто, когда я смотрю на это ... но я отскакивал от этого со вчерашнего дня, и ничего не работает. Кто-нибудь знает, куда мне идти? Заранее спасибо!

edit: Опубликованные вещи работают, но результаты оказались не такими, как я ожидал. Вот некоторые данные saple:

ID  Card  PunchDate  PunchTime In/Out
================================
1  00123  3/17/2012  13:00  1
2  00123  3/17/2012  17:00  2
3  00123  3/17/2012  17:00  1
4  00123  3/17/2012  20:00  2
5  00456  3/17/2012  14:00  1
6  00456  3/17/2012  17:00  2

Причина, по которой я пытаюсь это сделать, заключается в том, что программное обеспечение для хронометража решает, что что-либо с картой, punchdate и punchtime, идентичное другому, является дубликатом, независимо от того, является ли оно ударом in или out, и удаляет одно , Мое единственное решение состоит в том, чтобы устранить дубликаты и в основном делать удары от первого в перфорации до последнего выпадения, где они дублируются. Поэтому моя цель состоит в том, чтобы выбрать только уникальные значения, основанные на карточке, дате удара и времени удара. Однако то, что я имею, не исключает ID в вопросе, который делает его уникальным значением. У меня есть обходной путь для этого, так что время не представляет особой проблемы, но я бы предпочел выяснить, как я могу получить правильные данные.

Еще раз всем спасибо за быстрые ответы!

Ответы [ 5 ]

2 голосов
/ 29 марта 2012

При условии, что нет 2-й смены, которая начинается в один день и заканчивается в следующий ...

Таблица:

DECLARE @table TABLE
    (
      [ID] INT IDENTITY,
      [Card] INT,
      [PunchDate] DATETIME,
      [PunchTime] DATETIME,
      [In/Out] TINYINT
    )
INSERT  INTO @table
        (
          [Card],
          [PunchDate],
          [PunchTime],
          [In/Out]
        )
        SELECT  00123,
                '3/17/2012',
                '3/17/2012 13:00',
                1
        UNION ALL
        SELECT  00123,
                '3/17/2012',
                '3/17/2012 17:00',
                2
        UNION ALL
        SELECT  00123,
                '3/17/2012',
                '3/17/2012 17:00',
                1
        UNION ALL
        SELECT  00123,
                '3/17/2012',
                '3/17/2012 20:00',
                2
        UNION ALL
        SELECT  00456,
                '3/17/2012',
                '3/17/2012 14:00',
                1
        UNION ALL
        SELECT  00456,
                '3/17/2012',
                '3/17/2012 17:00',
                2

Запрос:

SELECT  [Card],
        [PunchDate],
        MIN([PunchTime]) [PunchTime],
        [In/Out]
FROM    @table
WHERE   [In/Out] = 1
GROUP BY [Card],
        [PunchDate],
        [In/Out]
UNION
SELECT  [Card],
        [PunchDate],
        MAX([PunchTime]) [PunchTime],
        [In/Out]
FROM    @table
WHERE   [In/Out] = 2
GROUP BY [Card],
        [PunchDate],
        [In/Out]
ORDER BY [Card],
        [PunchDate]

Результат:

Card    PunchDate   PunchTime   In/Out
123 2012-03-17 00:00:00.000 2012-03-17 13:00:00.000 1
123 2012-03-17 00:00:00.000 2012-03-17 20:00:00.000 2
456 2012-03-17 00:00:00.000 2012-03-17 14:00:00.000 1
456 2012-03-17 00:00:00.000 2012-03-17 17:00:00.000 2

Далее он захочет это:

SELECT  a.[Card],
        a.[PunchDate],
        a.[PunchTime],
        b.[PunchTime],
        DATEDIFF(hour, a.[PunchTime], b.[PunchTime]) TotalTime
FROM    (
          SELECT    [Card],
                    [PunchDate],
                    MIN([PunchTime]) [PunchTime]
          FROM      @table
          WHERE     [In/Out] = 1
          GROUP BY  [Card],
                    [PunchDate]
        ) a
        INNER JOIN (
                     SELECT [Card],
                            [PunchDate],
                            MAX([PunchTime]) [PunchTime]
                     FROM   @table
                     WHERE  [In/Out] = 2
                     GROUP BY [Card],
                            [PunchDate]
                   ) b
            ON a.[Card] = b.[Card]
               AND a.[PunchDate] = b.[PunchDate]
ORDER BY a.[Card],
        a.[PunchDate]

Результат

Card    PunchDate   PunchTime   PunchTime                   TotalTime
123 2012-03-17 00:00:00.000 2012-03-17 13:00:00.000 2012-03-17 20:00:00.000 7
456 2012-03-17 00:00:00.000 2012-03-17 14:00:00.000 2012-03-17 17:00:00.000 3
2 голосов
/ 29 марта 2012

ОБНОВЛЕННЫЙ ОТВЕТ С НОВОЙ ИНФОРМАЦИЕЙ:

SELECT *
FROM TABLE
WHERE NOT EXISTS
(
    SELECT 1 
    FROM TABLE AS Duplicates
    WHERE Duplicates.Card = TABLE.Card
        AND Duplicates.PunchDate = TABLE.PunchDate
        AND Duplicates.PunchTime = TABLE.PunchTime
        AND Duplicates.ID != TABLE.ID
)

По сути, это говорит о том, что получить все записи, которые не имеют одинаковые card, punchdate, punchtime (убедитесь, что не учитываютсятот же ряд против себя.)

1 голос
/ 29 марта 2012
Select
  *
FROM
  table
WHERE
  NOT EXISTS (
    SELECT
      *
    FROM
      table AS lookup
    WHERE
          ID       <> table.ID
      AND Card      = table.Card
      AND PunchTime = table.PunchTime
      AND PunchDate = table.PunchDate
  )
0 голосов
/ 29 марта 2012
Select ID from table where ID in (
select ID from (
   Select distinct ID, 
   Card, 
   PunchTime, 
   PunchDate
   FROM 
   OTHER_TABLE
   ) x
)

В предложении IN может быть только один столбец;поэтому вам нужно присвоить псевдониму (x - в моем ответе) результат и просто выбрать столбец идентификатора.Также обратите внимание, что внутри подпункта необходимо указать таблицу, из которой вы выбираете дополнительные столбцы (см. CAPS в моем ответе).

0 голосов
/ 29 марта 2012
Select ID 
from table 
where ID 
in 
(SELECT A.ID FROM (Select distinct ID, Card, PunchTime, PunchDate) A);

В вашем запросе вы написали .. у вас должно быть только одинаковое количество столбцов как вне предложения IN, так и внутри предложения IN.Если вы используете один столбец, вам не нужны скобки за пределами предложения IN, но если у вас есть несколько столбцов, вам необходимо включить их в скобки.Столбец)

SELECT Col1,Col2 ..Coln FROM TABLE WHERE (Col1,Col2..Coln) IN (SELECT Col1,Col2..Coln FROM TABLE ...) (для нескольких столбцов)

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