2012-10-16 13 views
2

Я отнюдь не эксперт по SQL и не знаю, как это сделать.SQL Сглаживание данных

Мне нужно сгладить некоторые данные, чтобы создать его для SQL-отчетов.

При этом мой вопрос, который я не думаю, что является оптимальным, так как это медленно, и я уверен, что есть 10 лучший способа сделать это:

Ядра колонок здесь InspectionID, который является первичным ключом на таблице осмотров

Любые советы?

SELECT  
    INSP.HouseSiteNo, 
    (SELECT TOP 1 WORKFLOWSTATES.Name FROM INSPECTIONWORKFLOWITEM WFITEM 
     INNER JOIN WORKFLOWSTATES ON WFITEM.WorkflowStateID = WORKFLOWSTATES.WorkflowStateID 
     WHERE WFITEM.InspectionID = INSP.InspectionID AND WORKFLOWSTATES.StateNumber = 1) as StateName 
    FROM INSPECTIONS INSP  
ORDER BY HouseSiteNo 

В таблице структуры как следующим образом:

инспектирование:

HouseSiteNo  HouseType ProjectID        InspectionID 
1    A   543C6381-8704-4129-B484-05B02927F690 E061F76F-8998-450B-B08C-DA2817B310A4 
2    A   543C6381-8704-4129-B484-05B02927F690 E0D1F3DB-51D4-465A-A0B4-ACFFF181DC56 

INSPECTIONWORKFLOWITEM

InspectionID       WorkflowStateID       DateStarted    StateCompleted ID 
FAA4E366-1D57-4699-982C-001FF351D717 AB2B7DA0-A90A-46FB-8F4B-8E662191E380 2012-09-09 00:00:00.000 0 D77332CB-D026-409A-814D-5632C109850A 
FAA4E366-1D57-4699-982C-001FF351D717 E2AC895A-0986-4A03-B104-A727D41405E3 2012-09-09 00:00:00.000 0 F118FD02-20C4-4B45-8539-6F8BDC6B3868 
FAA4E366-1D57-4699-982C-001FF351D717 F0469593-1B6B-4F98-92AE-DF50E76B9ED8 2012-09-09 00:00:00.000 0 8FBEE61B-D7B3-4D13-9FC8-730EB0FE7C95 
FAA4E366-1D57-4699-982C-001FF351D717 5929D0CA-E8B0-42EE-9CF4-E3FBC9973AA6 2012-09-09 00:00:00.000 0 02646FE5-B338-4D6F-B5F5-7984B0EF7BF5 
FAA4E366-1D57-4699-982C-001FF351D717 ECDDB790-88A4-4654-889D-BCA577C35CA8 2012-09-09 00:00:00.000 0 0B9C26FA-8D9D-4552-A3FE-84D4D21F5791 
FAA4E366-1D57-4699-982C-001FF351D717 099D66A4-16F2-4E72-A42A-06B4D6DC0102 2012-09-09 00:00:00.000 0 3B90F113-5194-4ED2-B920-8DA004C9EA5C 
FAA4E366-1D57-4699-982C-001FF351D717 66132F53-0A0E-431A-AD84-ADE77656CDF0 2012-09-09 00:00:00.000 0 05223484-8BB3-43A8-A9A8-C8FBC6270186 
9AC52A0A-BC2D-4BBD-9585-0028C07ACC27 F0469593-1B6B-4F98-92AE-DF50E76B9ED8 2012-09-09 00:00:00.000 0 A1471AF4-B733-488C-86B4-FB29970E536E 
9AC52A0A-BC2D-4BBD-9585-0028C07ACC27 ECDDB790-88A4-4654-889D-BCA577C35CA8 2012-09-09 00:00:00.000 0 30F3A1F9-6E51-4504-A9FD-B32FD2B35B39 
9AC52A0A-BC2D-4BBD-9585-0028C07ACC27 5929D0CA-E8B0-42EE-9CF4-E3FBC9973AA6 2012-09-09 00:00:00.000 0 760D4907-ED6C-4D84-AED9-775FBBAE5123 
9AC52A0A-BC2D-4BBD-9585-0028C07ACC27 AB2B7DA0-A90A-46FB-8F4B-8E662191E380 2012-09-09 00:00:00.000 0 49D632C7-31D0-4818-AC36-564F157D1959 
9AC52A0A-BC2D-4BBD-9585-0028C07ACC27 66132F53-0A0E-431A-AD84-ADE77656CDF0 2012-09-09 00:00:00.000 0 C6771081-198D-475B-BA09-14BB696567DA 
9AC52A0A-BC2D-4BBD-9585-0028C07ACC27 099D66A4-16F2-4E72-A42A-06B4D6DC0102 2012-09-09 00:00:00.000 0 F265B140-25C5-46CA-B060-2A27CD9F9D00 
9AC52A0A-BC2D-4BBD-9585-0028C07ACC27 E2AC895A-0986-4A03-B104-A727D41405E3 2012-09-09 00:00:00.000 0 E56AEC15-4BA1-4089-B1A7-3BF054568929 

WORKFLOWSTATES

WorkflowStateID       Name   StateNumber 
099D66A4-16F2-4E72-A42A-06B4D6DC0102 State 3  3 
AB2B7DA0-A90A-46FB-8F4B-8E662191E380 State 6  6 
E2AC895A-0986-4A03-B104-A727D41405E3 State 1  1 
66132F53-0A0E-431A-AD84-ADE77656CDF0 State 2  2 
ECDDB790-88A4-4654-889D-BCA577C35CA8 State 5  5 
F0469593-1B6B-4F98-92AE-DF50E76B9ED8 State 7  7 
5929D0CA-E8B0-42EE-9CF4-E3FBC9973AA6 State 4  4 
+2

Вы забыли показать таблицу WORKFLOWSTATES (http://www.sqlfiddle.com/#!3/bd43e/1) и задать вопрос. – GolfWolf

+0

Извините, что добавили его сейчас, tx – Fox

+0

Кроме того, вопрос, который я задаю, - это .. Я делаю это правильно? Нет ли другого способа сгладить данные в одну строку? Мы все знаем, как отчеты трюков SQL могут быть ... Tx – Fox

ответ

0

Не уверен, что это то, что вы ищете.

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

SELECT i.HouseSiteNo, w.Name 
FROM Inspections i 
JOIN InspectionWorkflowItem wfi on i.InspectionID = wfi.InspectionID 
JOIN WorkflowStatus w on w.WorkflowStateID = wfi.WorkflowStateID 
WHERE w.StateNumber = 1 
ORDER BY i.HouseSiteNo 
+0

Это не работает. У меня есть несколько записей в таблице InspectionWorkflowItem. Единственная причина, почему ваши работы связаны с предложением WHERE. Как только я удаляю WHERE, я получаю несколько строк назад ... – Fox

1

Если вы используете SQL Server 2005 или более поздней версии вы можете использовать cross/outer apply:

SELECT INSP.HouseSiteNo, StateName.Name 
FROM INSPECTIONS INSP 
CROSS APPLY 
(
    SELECT TOP 1 WORKFLOWSTATES.Name FROM INSPECTIONWORKFLOWITEM WFITEM 
    INNER JOIN WORKFLOWSTATES ON WFITEM.WorkflowStateID = WORKFLOWSTATES.WorkflowStateID 
    WHERE WFITEM.InspectionID = INSP.InspectionID AND WORKFLOWSTATES.StateNumber = 1 
) StateName 
ORDER BY HouseSiteNo 

, когда я запускаю это два запроса в один пакетный фактический план выполнения показывает, что запрос стоимости по отношению к партии является 68%, а у меня 32% - это огромный прирост производительности. Увеличение эффективности было вызвано отсутствием ORDER BY статута. В настоящее время они оба составляют 50% относительно партии.

+0

Привет. Это работает очень хорошо, за исключением того, что мой запрос будет довольно большим. Проблема в том, что CROSS APPLY нужно будет скопировать несколько раз, потому что у меня 7 Workflowstates. Кроме того, есть и другой столбец, который я хотел бы извлечь – Fox

+0

Я мог бы скрещивать крест в функции и продолжать называть его? – Fox

+0

@Fox Можете ли вы добавить к вопросу точный результат, который хотите получить? –

0

Это потенциальная проблема. Top 1 в отсутствие уникального сорта не является детерминированным.
Даже таблица с кластеризованным ПК не гарантирует возврата одного и того же верхнего 1 без сортировки.

SELECT TOP 1 WORKFLOWSTATES.Name 
FROM INSPECTIONWORKFLOWITEM WFITEM 
INNER JOIN WORKFLOWSTATES 
    ON WFITEM.WorkflowStateID = WORKFLOWSTATES.WorkflowStateID 
WHERE WFITEM.InspectionID = INSP.InspectionID 
    AND WORKFLOWSTATES.StateNumber = 1 


SELECT INSP.HouseSiteNo, min(WORKFLOWSTATES.Name) -- at least min is deterministic 
FROM FROM INSPECTIONS INSP 
JOIN INSPECTIONWORKFLOWITEM WFITEM 
    ON WFITEM.InspectionID = INSP.InspectionID 
JOIN WORKFLOWSTATES 
    ON WORKFLOWSTATES.WorkflowStateID = WFITEM.WorkflowStateID 
AND WORKFLOWSTATES.StateNumber = 1 
GROUP BY INSP.HouseSiteNo 
ORDER BY INSP.HouseSiteNo 
Смежные вопросы