удаление повторяющихся строк, если один из столбцов одного и того же Sql-сервера

0

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

Результаты запроса

ID | Machine | description | createdtime |  product code |  work order | qty  | comment | Reson
        No
129  |1 |  A name | 2015-01-08 07:38:41.427 | A code  |   12/14/0038 |  4000  | comment   | Reason
143  |1 |  A name | 2015-01-08 13:30:39.403 | A code  |   12/14/0038 |  4000  | comment    | Reson
130  |4 |  A name | 2015-01-08 07:38:46.540 | A code  |   12/14/0045 |  12000 | comment   | Reason
131  |5 |  A name | 2015-01-08 07:38:50.243 | A code  |   01/15/0001 |  4000  | comment   | Reason

Как вы можете видеть здесь, есть две записи с машиной номер 1, одна созданная утром и одна после полудня, однако я хочу только, чтобы последний отображался, вот мой запрос.

SELECT     Qualitycontrol.ID, Qualitycontrol.MachineNo, Qualitycontrol.Description,        Qualitycontrol.CreatedTime, Qualitycontrol.ProductCode, Qualitycontrol.WorkOrder, 
              Qualitycontrol.Quantity, Qc.Comment, Qc.Reason
FROM         Qualitycontrol 
OUTER APPLY (
  SELECT TOP 1 *
FROM QualityControl_Comments
WHERE Qualitycontrol.ID = QCUID
ORDER BY Qualitycontrol.ID DESC -- whatevet defines order in QualityControl_Comments
) AS Qc                  
WHERE     (Qualitycontrol.CreatedTime BETWEEN CAST(GETDATE() AS DATE) AND DATEADD(DAY, 1,     CAST(GETDATE() AS DATE)))
ORDER BY Qualitycontrol.MachineNo
  • 0
    Попробуйте полностью определить QCUID - то есть использовать QualityControl_Comments.QCUID в вашей внешней области применения. В противном случае я не вижу ничего плохого в этом
  • 0
    Проблема в том, что он тянет все записи за день, однако я просто хочу, чтобы последний за день, часть в отношении таблицы комментариев в порядке
Показать ещё 1 комментарий
Теги:
sql-server

2 ответа

1
Лучший ответ

Возможно, что-то вроде этого будет работать.

SELECT     Qualitycontrol.ID, Qualitycontrol.MachineNo, Qualitycontrol.Description,        Qualitycontrol.CreatedTime, Qualitycontrol.ProductCode, Qualitycontrol.WorkOrder, 
              Qualitycontrol.Quantity, Qc.Comment, Qc.Reason
FROM         Qualitycontrol 
OUTER APPLY (
  SELECT TOP 1 *
FROM QualityControl_Comments
WHERE Qualitycontrol.ID = QualityControl_Comments.QCUID
ORDER BY Qualitycontrol.ID DESC -- whatevet defines order in QualityControl_Comments
) AS Qc                  
INNER JOIN 
(
    SELECT Qualitycontrol.MachineNo, MAX(Qualitycontrol.ID) MID
    FROM Qualitycontrol
    GROUP BY Qualitycontrol.MachineNo
) UNQ ON UNQ.MID = Qualitycontrol.ID
WHERE     (Qualitycontrol.CreatedTime BETWEEN CAST(GETDATE() AS DATE) AND DATEADD(DAY, 1,     CAST(GETDATE() AS DATE)))
ORDER BY Qualitycontrol.MachineNo
  • 0
    Эй, спасибо за это, это прекрасно работает для того, что мне нужно
1

Вы можете использовать нечто подобное. Используя row_number, вы можете разбить свои данные по идентификатору machnine и отсортировать число по дате. Чем вы можете просто использовать простой, где clouse, чтобы выбрать то, что вы хотите

;WITH CTE
as
(
SELECT     Qualitycontrol.ID, Qualitycontrol.MachineNo, Qualitycontrol.Description,        Qualitycontrol.CreatedTime, Qualitycontrol.ProductCode, Qualitycontrol.WorkOrder, 
              Qualitycontrol.Quantity, Qc.Comment, Qc.Reason
FROM         Qualitycontrol 
OUTER APPLY (
  SELECT TOP 1 *
FROM QualityControl_Comments
WHERE Qualitycontrol.ID = QCUID

) AS Qc                  
WHERE     (Qualitycontrol.CreatedTime BETWEEN CAST(GETDATE() AS DATE) AND DATEADD(DAY, 1,     CAST(GETDATE() AS DATE)))

), CTE2 as 
(
select *, row_number() over(partition by MachineNo order by CreatedTime desc) as 'row_index' from cte
)
select * from cte2
where row_index = 1
order by MachineNo
  • 0
    Эй, я получаю эти ошибки Msg 4104, Уровень 16, Состояние 1, Строка 17 Не удалось связать идентификатор из нескольких частей «Qualitycontrol.MachineNo». Сообщение 4104, уровень 16, состояние 1, строка 17 Не удалось связать идентификатор из нескольких частей «Qualitycontrol.CreatedTime».
  • 0
    Пожалуйста, попробуйте сейчас, я не могу проверить запрос, но, пожалуйста, попробуйте сейчас. Я обновил ответ
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню