2016-05-03 2 views
-1

У меня есть запрос, который будет искать любые «Open_Tollgates», которые имеют статус «6» (не завершен), а также ответственный «Департамент».Подзапрос для мин (значение поля)

Я ТОЛЬКО хочу получить мин (pgAct.Gate_ID) (первый номер Gate_Number, который не является полным).

Проблема в том, что каждый Tollgate (то есть '706') отличается тем, что имеет определенный идентификатор активности (не отображается).

Я знаю, что мне нужно сделать подзапрос, чтобы отфильтровать данные. Как видно ниже, мне по существу понадобится только в первой строке (706 3 Sourcing).

Что вы посоветуете?

Перед подзапроса:

select pgAct.ID as Open_Tollgate, pgAct.Gate_ID as Gate_Number, secGroup.[Group] as Department 
from [dbo].[Project_Gate_Activities] pgAct 
join [dbo].[Activities] as Act 
on pgAct.activity_order = Act.order_id 
join [dbo].[Security_Group] as secGroup 
on Act.group_id = secGroup.group_id 
where pgAct.ID = 706 
and status_id = 6 
group by pgAct.id, pgAct.gate_id, secGroup.[Group] 

Перед подзапроса результирующего набора:

706 3 Sourcing

706 4 Учет

706 4 Финансы

706 4 Логистика

706 5 IT

706 6 Учет

706 6 Финансы

706 6 Покупка

706 7 IT

706 7 Продажи

706 8 Учет

+0

Посмотрите на то, что вы вывесили и спросите себя, если вы могли бы ответьте на этот вопрос, исходя из того, что вы разместили. Мы не знаем ваш проект, структуры таблиц, данные или требования. Мы нуждаемся во всех тех, кто может помочь. Попробуйте посмотреть здесь. http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

+0

Вы хотите MIN gate_ID, так почему вы группируете GateID? Не можете ли вы просто удалить его из GROUP BY и поместить MIN в список SELECT? –

+0

Возможный дубликат [Выбрать первую строку в каждой группе GROUP BY?] (Http://stackoverflow.com/questions/3800551/select-first-row-in-each-group-by-group) –

ответ

0

Вы можете попробовать использовать ROW_NUMBER .. вам нужно использовать подзапрос или cte, как это.

;WITH cte AS 
    (SELECT pgAct.ID AS Open_Tollgate, 
      pgAct.Gate_ID AS Gate_Number, 
      secGroup.[Group] AS Department, 
      ROW_NUMBER() OVER (PARTITION BY pgAct.ID ORDER BY pgAct.Gate_ID) Rn 
    FROM [dbo].[Project_Gate_Activities] pgAct 
      JOIN [dbo].[Activities] AS Act ON pgAct.activity_order = Act.order_id 
      JOIN [dbo].[Security_Group] AS secGroup ON Act.group_id = secGroup.group_id 
    WHERE pgAct.ID = 706 
      AND status_id = 6 
    GROUP BY pgAct.id, 
      pgAct.gate_id, 
      secGroup.[Group] 
    ) 
SELECT * FROM cte WHERE Rn = 1 

если вы только выбрать один pgAct.ID в то время .. Вы также можете использовать SELECT, TOP 1, например, так

SELECT TOP 1 
     pgAct.ID AS Open_Tollgate, 
     pgAct.Gate_ID AS Gate_Number, 
     secGroup.[Group] AS Department, 
FROM [dbo].[Project_Gate_Activities] pgAct 
     JOIN [dbo].[Activities] AS Act ON pgAct.activity_order = Act.order_id 
     JOIN [dbo].[Security_Group] AS secGroup ON Act.group_id = secGroup.group_id 
WHERE pgAct.ID = 706 
     AND status_id = 6 
ORDER BY pgAct.ID, 
     pgAct.Gate_ID 
Смежные вопросы