Nano Hash - криптовалюты, майнинг, программирование

SQL Server ВНУТРЕННЕЕ СОЕДИНЕНИЕ с GROUP BY

У меня есть два стола, к которым я хочу присоединиться. Первая таблица называется WorkItem:

введите описание изображения здесь

Вторая таблица WorkItem_Schedule:

введите описание изображения здесь

Я хочу получить первую строку, соединенную с ActualEndDate IS NULL.

В случае WorkItemId 3 я хочу присоединиться к нему только на WorkItemScheduleId 95. Только первая строка!

Я пробовал этот оператор SQL, но у меня возникли проблемы:

  SELECT 
      W.WorkItemId
      ,MIN(WS.WorkItemScheduleId) test
      ,W.WorkItemName
      ,WS.[PhaseName]
      ,WS.[StartDate]
      ,WS.[EndDate]
      ,WS.[ActualStartDate]
      ,WS.[ActualEndDate]
  FROM 
      WorkItem W
  INNER JOIN 
      WorkItem_Schedule WS ON W.WorkItemId = WS.WorkItemId
  WHERE 
      WS.ActualEndDate IS NULL
  GROUP BY 
      W.WorkItemId;

Я получаю ошибку

Столбец WorkItem.WorkItemName недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY.

Я погуглил эту ошибку и обнаружил, что мне нужно добавить другие столбцы в список выбора для группировки, поэтому я попробовал этот sql, но он возвращает все расписания, а не отдельный рабочий элемент:

SELECT 
   W.WorkItemId
  ,MIN(WS.WorkItemScheduleId) test
  ,W.WorkItemName
  ,WS.[PhaseName]
  ,WS.[StartDate]
  ,WS.[EndDate]
  ,WS.[ActualStartDate]
  ,WS.[ActualEndDate]
FROM 
    WorkItem W
INNER JOIN 
    WorkItem_Schedule WS ON W.WorkItemId = WS.WorkItemId
WHERE 
    WS.ActualEndDate IS NULL
GROUP BY 
    W.WorkItemId, WS.PhaseName, WS.StartDate, WS.EndDate, WS.ActualStartDate, WS.ActualEndDate;

Пожалуйста помоги! Заранее спасибо!


  • W.WorkItemId: W.WorkItemName по умолчанию рассматривается как 1: N, поэтому, если вы группируете по идентификатору, у вас может быть несколько имен для него. Я полагаю, что что-то вроде min (W.WorkItemName) должно решить проблему. 15.01.2015
  • Взгляните на тег наибольшее количество на группу 15.01.2015
  • Какова логика присоединения к строке 95? Все строки имеют значение ActualEndDate NULL. Первая присоединенная строка, по какому порядку? 15.01.2015

Ответы:


1

cross apply, вероятно, самый простой способ сделать это:

select w.*, ws.*
from WorkItem w cross apply
     (select top 1 ws.*
      from WorkItem_Schedule ws
      where ws.WorkItemId = w.WorkItemId and
            ws.ActualEndDate is null
      order by ws.WorkItemScheduleId
     ) ws;

Под «первым», я полагаю, вы имеете в виду тот, у которого наименьшее WorkItemScheduleId.

15.01.2015

2

Вы можете использовать функцию ROW_NUMBER(), чтобы получить «первую» присоединенную строку.

SELECT * FROM (
  SELECT 
   W.WorkItemId
  ,WS.WorkItemScheduleId
  ,CASE WHEN WS.ActualEndDate IS NULL 
        THEN ROW_NUMBER() OVER (PARTITION BY W.WorkItemId ORDER BY WorkItemScheduleId)  --ROW_NUMBER() only invoked when the ActualEndDate IS NULL 
        ELSE -1 END AS ROWN
  ,W.WorkItemName
  ,WS.[PhaseName]
  ,WS.[StartDate]
  ,WS.[EndDate]
  ,WS.[ActualStartDate]
  ,WS.[ActualEndDate]
  FROM WorkItem W
INNER JOIN WorkItem_Schedule WS
ON W.WorkItemId = WS.WorkItemId    
GROUP BY W.WorkItemId, WS.PhaseName, WS.StartDate, WS.EndDate, WS.ActualStartDate, WS.ActualEndDate) A
WHERE ROWN = 1 --Getting the "first" instance
15.01.2015
  • лучший способ или нет, вот как я бы это сделал 15.01.2015

  • 3

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

    SELECT 
    W.WorkItemId
    ,W.WorkItemName
    ,WS.[PhaseName]
    ,WS.[StartDate]
    ,WS.[EndDate]
    ,WS.[ActualStartDate]
    ,WS.[ActualEndDate]
    FROM WorkItem W
    JOIN WorkItem_Schedule WS
     ON W.WorkItemId = WS.WorkItemId
    WHERE WS.ActualEndDate IS NULL
    AND NOT EXISTS(
       SELECT 'PREVIOUS'
       FROM WorkItem_Schedule WS2
       WHERE W2.WorkItemId = WS.WorkItemId
       AND WS2.StartDate < WS.StartDate
       AND WS2.ActualEndDate IS NULL
    

    )

    15.01.2015

    4

    Присоединение к определенной строке спектра значений относительно просто и не требует никаких хитрых уловок. Во-первых, простое соединение покажет вам все строки-кандидаты. Как видите, вы выполнили 80% запроса:

    SELECT
        W.WorkItemId
        ,WS.WorkItemScheduleId
        ,W.WorkItemName
        ,WS.[PhaseName]
        ,WS.[StartDate]
        ,WS.[EndDate]
        ,WS.[ActualStartDate]
        ,WS.[ActualEndDate]
    FROM 
        WorkItem W
    INNER JOIN 
        WorkItem_Schedule WS 
     ON W.WorkItemId = WS.WorkItemId
    WHERE 
        WS.ActualEndDate IS NULL
    

    Это дает вам строку, которую вы хотите, а также другие. Теперь просто отфильтруйте те, которые вам не нужны. У того, который вы хотите, самая маленькая (самая ранняя) дата. Отлично. Выберите эту дату:

    ...
    WHERE 
        WS.ActualEndDate IS NULL
    and WS.StartDate =(
        select  Min( StartDate )
        from    WorkItem_Schedule
        where   WorkItemId = W.WorkItemId
           and  ActualEndDate is NULL );
    

    Не позволяйте подзапросу сбить вас с толку. Если ваша таблица правильно проиндексирована, она найдет вашу строку, используя только поиск по индексу.

    16.01.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..