2015-01-07 1 views
0

Я пытаюсь выбрать максимальное значение каждой группы на основе PrimaryMobile. Идея заключается в том, что для каждой группы я хочу, чтобы выбрать его последнее введенное значение (на основании его PersonId не на DateCreated)Получить четкую запись на основе столбца. Если последнее значение равно null, принимайте старое значение else новое значение

Мой взгляд данные любит

PersonID PrimaryMobile FirstName LastName City DateCreated 
1   34455666   CAD   Null  Pu  01-01-2014 
2   34455666   ABC   AND   Null 02-01-2015 
3   34455666   BFG   Null  Tu  Null 
4   34567   New   ABC   Null 01-01-2014 
5   34567   Null   Null  Ta  02-01-2014 

Результат, который я хочу

PersonID PrimaryMobile FirstName LastName City DateCreated 
3   34455666   BFG   AND   Tu  02-01-2015 
5   34567   New   ABC   Ta  02-01-2014 

Пожалуйста, дайте мне знать. Я могу достичь этого.

+0

Я не вижу никакой логики, которая приведет ко второму изображению. Вам действительно нужно объяснить, что вы хотите. –

+0

Просто подумайте, но не должно ли поле для FirstName для PersonID из 5 быть равно «NULL» и такое же для поля LastName для PersonID из 3? – hRdCoder

+0

Пожалуйста, возьмите relook, поскольку я обновил второй результат image – user1155773

ответ

0

Похоже, вы пытаетесь получить «лучшее» значение из каждого столбца. «Лучшее» определяется как не равное нулю и/или максимальному значению (даже для personid, которое не является вашим основным ключом). Кроме того, кажется, вам может понадобиться «ABC» вместо «ANB» для значения Lastname 34567.

Один из способов сделать это с подзапросами для каждого из параметров выбора. Я назвал ваш стол t1:

SELECT DISTINCT t1_outer.PrimaryMobile, 
    (SELECT MAX(PersonId) FROM t1 t1_inner WHERE t1_inner.PrimaryMobile = t1_outer.PrimaryMobile Where PersonId IS NOT NULL GROUP BY t1_inner.PrimaryMobile) AS PersonID, 
    (SELECT MAX(FirstName) FROM t1 t1_inner WHERE t1_inner.PrimaryMobile = t1_outer.PrimaryMobile WHERE FirstName IS NOT NULL GROUP BY t1_inner.PrimaryMobile) AS FirstName, 
    (SELECT MAX(LastName) FROM t1 t1_inner WHERE t1_inner.PrimaryMobile = t1_outer.PrimaryMobile WHERE LastName IS NOT NULL GROUP BY t1_inner.PrimaryMobile) AS LastName, 
(SELECT MAX(City) FROM t1 t1_inner WHERE t1_inner.PrimaryMobile = t1_outer.PrimaryMobile WHERE City IS NOT NULL GROUP BY t1_inner.PrimaryMobile) AS City, 
(SELECT MAX(DateCreated) FROM t1 t1_inner WHERE t1_inner.PrimaryMobile = t1_outer.PrimaryMobile WHERE DateCreated IS NOT NULL GROUP BY t1_inner.PrimaryMobile) AS DateCreated 
FROM t1 t1_outer 
+0

Ваш запрос не выглядит правильным. Основываясь на логике, он должен выбрать САПР для первого имени для первого номера телефона вместо BFG, поскольку CAD будет именем Max в этой группе. – KHeaney

2

Один из способов достичь желаемых результатов это с суб-выбора для каждого столбца (кроме PrimaryMobile):

SELECT 
(SELECT TOP 1 PersonId FROM MyTable t2 WHERE t2.PrimaryMobile=t1.PrimaryMobile ORDER BY PersonID DESC) AS PersonID, 
t1.PrimaryMobile, 
(SELECT TOP 1 FirstName FROM MyTable t2 WHERE t2.PrimaryMobile=t1.PrimaryMobile AND t2.FirstName IS NOT NULL ORDER BY PersonID DESC) AS FirstName 
{Same as above replacing "FirstName" with "LastName" and "City"} 
FROM MyTable t1 
GROUP BY t1.PrimaryMobile 
0

Это честно чувствует, как беспорядок но это лучший ответ, который я могу придумать. То, что я делаю ниже, разбивает каждый столбец на уникальную таблицу. Затем я выполняю функцию группировки в таблице, нахожу самое последнее значение Non Null для каждого столбца и присоединяюсь к столбцам на основе PrimaryMobile. Кроме того, как примечание, так как вы не дали имя таблицы, я буду считать, имя таблицы «Человек»

SQL

Select Max(Person.PersonID), 
    Person.PrimaryMobile, 
    FNameSet.FirstName, 
    LNameSet.LastName, 
    CitySet.City, 
    DateSet.DateCreated 
From Person 
    Left Outer Join (Select FNamePerson.PersonID, 
          FNamePerson.PrimaryMobile, 
          FNamePerson.FirstName, 
          FNameRowID = ROW_NUMBER() OVER (PARTITION BY FNamePerson.PrimaryMobile ORDER BY FNamePerson.PersonID DESC) 
        From Person FNamePerson 
        Where FNamePerson.FirstName Is Not Null) FNameSet 
     On Person.PrimaryMobile = FNameSet.PrimaryMobile 
    Left Outer Join (Select LNamePerson.PersonID, 
          LNamePerson.PrimaryMobile, 
          LNamePerson.LastName, 
          LNameRowID = ROW_NUMBER() OVER (PARTITION BY LNamePerson.PrimaryMobile ORDER BY LNamePerson.PersonID DESC) 
        From Person LNamePerson 
        Where LNamePerson.LastName Is Not Null) LNameSet 
     On Person.PrimaryMobile = LNameSet.PrimaryMobile 
    Left Outer Join (Select CityPerson.PersonID, 
          CityPerson.PrimaryMobile, 
          CityPerson.City, 
          CityRowID = ROW_NUMBER() OVER (PARTITION BY CityPerson.PrimaryMobile ORDER BY CityPerson.PersonID DESC) 
        From Person CityPerson 
        Where CityPerson.City Is Not Null) CitySet 
     On Person.PrimaryMobile = CitySet.PrimaryMobile 
    Left Outer Join (Select DatePerson.PersonID, 
          DatePerson.PrimaryMobile, 
          DatePerson.DateCreated, 
          DateRowID = ROW_NUMBER() OVER (PARTITION BY DatePerson.PrimaryMobile ORDER BY DatePerson.PersonID DESC) 
        From Person DatePerson 
        Where DatePerson.DateCreated Is Not Null) DateSet 
     On Person.PrimaryMobile = DateSet.PrimaryMobile 
Where FNameRowID = 1 
    And LNameRowID = 1 
    And CityRowID = 1 
    And DateRowID = 1 
Group By Person.PrimaryMobile, 
     FNameSet.FirstName, 
     LNameSet.LastName, 
     CitySet.City, 
     DateSet.DateCreated 

Примечание, однако, что это решение будет удалить номер если один столбцов не имеет никакой ценности, связанной с его группой. т.е. если вы удалили NEW из столбца FirstName вашего набора данных, вы не получите второе число в своем результирующем наборе.

Смежные вопросы