Дублирующиеся строки - SQL Server Groupby и Union - PullRequest
0 голосов
/ 12 марта 2019

У меня есть некоторые данные, подобные следующим:

--------------------------------------------------
Location  Weight  MarkedOldest  plantId  Date
--------------------------------------------------
101010    520     0             2        3/10/2019
105000    500     1             2        3/1/2019
105000    500     0             2        2/20/2019

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

Моя проблема возникает, когда я возвращаю список этих строк с требованиями представить суммарный вес в каждом местоположении, причем самое старое местоположение представляется первым. Идеальный результат для запроса, подобного этому, будет возвращать это:

105000  1000lbs  (3/1 and 2/20)
101010  520lbs   3/10

Я написал следующий запрос, который был близок:

select z.Location, Sum(z.Weight), as Weight, z.Date
FROM 
  (select Location, Weight, MarkedOldest
   from dbo.SomeTable WHERE MarkedOldest = 1 PlantId= 2 
   UNION
   select Location, Weight, MarkedOldest
   from dbo.SomeTable WHERE PlantId = 2) as z
Group by z.Location, z.MarkedOldest
Order By z.MarkedOldest desc

Этот запрос производитследующий вывод:

105000  500lbs  3/1/2019
105000  500lbs  2/20/2019
101010  520lbs  3/10/2019

Идея состояла в том, чтобы сначала выбрать любые старые строки, введенные вручную, и объединить их с оставшимися строками в старшем первом порядке.Приведенный выше вывод является почти правильным, но я хотел бы объединить / удалить дублирующиеся местоположения в верхних двух строках.Однако я не думаю, что смогу сделать это, потому что я группирую по столбцам 'MarkedOldest' и 'Date'

Есть ли другой способ решить этот запрос, чтобы получить ожидаемый результат?Я сталкивался с множеством ошибок groupBy / aggregate при попытке таких вещей, как удаление некоторых столбцов groupby или orderby.

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

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

WITH data as(
SELECT 105000 id ,CAST(LEFT('500lbs',LEN('500lbs')-3) AS numeric) AS lbs,  '3/1/2019' AS date union all
SELECT 105000 id ,LEFT('500lbs',LEN('500lbs')-3) AS lbs,  '2/20/2019' AS date union all
SELECT 101010 id ,LEFT('520lbs',LEN('520lbs')-3) AS lbs,  '3/1/2019' AS date
)

SELECT 
    ID
    ,CAST(SUM(lbs) as VARCHAR) +'lbs' lbs
    ,STUFF((SELECT DISTINCT ' and ' + d2.date
                     FROM data d2
                     WHERE d1.ID = d2.ID
                 FOR XML PATH('')) , 1, 5, '') AS  date
FROM data d1
GROUP BY ID
0 голосов
/ 12 марта 2019

Один из способов сделать это - сделать так, чтобы верхняя половина вашего UNION включала строку «Помеченные как самые старые» И все строки, предшествовавшие ей во времени.

WHERE Date<=(SELECT Date FROM MyTable WHERE MarkedOldest=1)

Затем вы можете Сгруппировать и Агрегировать эту половину UNION и сделать нижнюю половину просто включающей строки, которые идут после строки «Помечены как самые старые».

WHERE Date>(SELECT Date FROM MyTable WHERE MarkedOldest=1)

Приведенные выше фрагменты кода предполагают, что строка «Помеченная как самая старая» не может иметь такую ​​же точную дату, как и другая строка, которая не является «Помеченной как самая старая». Если это возможно, вам придется решить, что вы хотите делать с другой строкой и соответствующим образом кодировать.

...