2017-08-11 4 views
1

Ceci est une nouvelle version de ma question, car elle semble confuse. Pardon. Je l'ai compris. Voir le code si vous êtes intéressé. Les notes à résoudre sont là. Merci de votre aide!UNION et MIN/MAX avec regroupement et demande de date impaire

Je l'ai eu à travailler jusqu'à présent, mais l'OriginaionL (L est pour Little et B est pour Big) n'est pas correct. Il prend la bonne date mais pas l'origine.

CREATE TABLE MyTable 
(
    LoadTagID     INT, 
    EnteredDateTime   datetime, 
    JobNumber     VARCHAR(50), 
    Origination    VARCHAR(50) 
) 

INSERT INTO MyTable VALUES 
(1, '2015-02-09 00:00:00.00', 11111, 'Here') 
,(2, '2015-02-09 00:00:00.00', 22222, 'There') 
,(3, '2016-03-09 00:00:00.00', 11111, 'Outside') 
,(4, '2016-08-09 00:00:00.00', 12578, 'Anywhere') 
,(252, '2017-06-29 00:00:00.00', 12345, 'Here') 
,(253, '2017-08-01 00:00:00.00', 99999, 'There') 
,(254, '2017-08-04 00:00:00.00', 12345, 'Outside') 
,(255, '2017-08-09 00:00:00.00', 12345, 'Anywhere') 
,(256, '2017-08-10 00:00:00.00', 99999, 'Anywhere') 
,(257, '2017-08-10 00:00:00.00', 123456, 'Anywhere') 
,(258, '2017-08-11 00:00:00.00', 123456, 'Over Yonder') 
,(259, '2017-08-13 00:00:00.00', 99999, 'Under The Bridge') 

--Select * From MyTable 

CREATE TABLE #LTTB1   --MAX 
( 
    LoadTagID varchar(50), 
    JobNumber varchar(50), 
    EnteredDateTime varchar(50), 
    Origination varchar(50) 
) 
CREATE TABLE #LTTB2   --MIN 
(
    LoadTagID varchar(50), 
    JobNumber varchar(50), 
    EnteredDateTime varchar(50),   
    Origination varchar(50) 
) 
CREATE TABLE #LTTB3 
(
    LoadTagIDL varchar(50), 
    JobNumberL varchar(50), 
    EnteredDateTimeL 
    varchar(50), 
    OriginationL varchar(50) 
    , LoadTagID varchar(50), 
    JobNumber varchar(50), 
    EnteredDateTime varchar(50), 
    Origination varchar(50) 
) 


INSERT INTO #LTTB1 
SELECT 
    MAX(LoadTagID) AS LoadTagID, 
    JobNumber, 
    MAX(EnteredDateTime) AS EnteredDateTime, 
    MAX(Origination) AS Origination 
FROM MyTable 
WHERE CONVERT (Date, EnteredDateTime) >= CONVERT (Date, GETDATE()-10) --Gets the last 10 days. 
GROUP BY JobNumber ORDER BY JobNumber 

INSERT INTO #LTTB2 
SELECT MIN(LoadTagID) AS LoadTagIDL, 
    JobNumber AS JobNumberL, 
    MIN(EnteredDateTime) AS EnteredDateTimeL, 
    MAX(Origination) AS OriginationL --MAX! This needed to be max!! Why? 
FROM MyTable 
Where CONVERT (Date, EnteredDateTime) >= CONVERT (Date, GETDATE()-60) --Goes further back in case one is a long. 
GROUP BY JobNumber ORDER BY JobNumber 

INSERT INTO #LTTB3 
SELECT L.LoadTagID AS LoadTagIDL 
    , L.JobNumber AS JobNumberL 
    , L.EnteredDateTime AS EnteredDateTimeL 
    , L.Origination AS OriginationL 
    , B.LoadTagID, B.JobNumber, B.EnteredDateTime, B.Origination 
FROM #LTTB1 B --MAX 
INNER JOIN #LTTB2 L ON B.JobNumber = L.JobNumber 

Select * From #LTTB3 

Donc, pour numéro_travail 6/29 est correcte 12345, mais il devrait être « ici » et non « Partout:

Pour 99999 tout est correct, mais pour 8/1 il devrait être « là » et nulle part. cela semble être la valeur moyenne dans l'ensemble. Je suis tellement confus.

est-ce que quelqu'un sait pourquoi il est saisissant cette valeur? Merci.

Répondre

0
SELECT * 
FROM mytable 
WHERE LoadTagID=(SELECT MIN(LoadTagID) 
       FROM mytable) 
OR LoadTagID=(SELECT MAX(LoadTagID) 
       FROM mytable); 

requête en fonction de la sortie que vous voulez

+0

Merci. Cela fonctionnerait mais il ne sélectionne que les valeurs min et max et renvoie 2 lignes. J'en ai besoin groupé par le numéro d'emploi. Il devrait donc retourner 2 enregistrements pour chaque travail, ce qui pourrait être des centaines de lignes. –

0
CREATE TABLE MyTable 
(
    LoadTagID  INT, 
    Date   Date, 
    Job   INT, 
    Origination VARCHAR(20) 
) 

INSERT INTO MyTable 
VALUES(
     252, '6/29/17', 12345, 'Here') 
    ,(253, '8/1/17', 99999, 'There') 
    ,(254, '8/4/17', 12345, 'Outside') 
    ,(255, '8/8/17', 12345, 'Anywhere') 

--SELECT * FROM MyTable 

SELECT * INTO #Table1 
FROM MyTable 
WHERE LoadTagID IN (SELECT MIN(LoadTagID) 
        FROM MyTable) 

SELECT * INTO #Table2 
FROM MyTable 
WHERE LoadTagID IN (SELECT MAX(LoadTagID) 
        FROM MyTable) 

SELECT * INTO #T3 
FROM (SELECT * FROM #Table1 T1 
     UNION ALL 
     SELECT * FROM #Table2 T2 
    ) A 

SELECT #T3.Date, 
     #T3.Job, 
     #T3.LoadTagID, 
     #T3.Origination 
FROM #T3 
LEFT JOIN #Table1 T1 
ON T1.Job=#T3.Job 
WHERE T1.Job IS NOT NULL 
+0

Merci. C'est proche mais il n'est pas groupé par job et il manque la date. Eh bien, il ne manque pas la date mais je ne peux pas grouper par le travail et le faire retourner la date. C'est ce que j'ai jusqu'ici. Merci Sélectionnez Max (LoadTagID) comme Max, jobnumber EN # Tableau1 De MyTable Où Convert (Date, EnteredDateTime)> = Convert (Date, GETDATE() - 7) groupe par numéro_travail Trier par numéro_travail Sélectionnez Min (LoadTagID) comme Min, Jobnumber INTO # Table2 De MyTable Grouper par JobNumber –

+0

Eh bien je l'ai mieux fonctionné et ai mis à jour ma question originale pour que tout le monde puisse comprendre. Cela fonctionne mais il me manque les deux colonnes principales qu'ils veulent voir. Donc, je dois comprendre comment faire cela avec un groupe de. Je vous remercie. –

+0

Merci pour la mise à jour. J'ai ajouté plus de données à l'ensemble d'échantillons. Il ne renvoie pas encore les bonnes valeurs. C'est beaucoup plus proche cependant. Merci de votre aide. –

0
INSERT INTO #LTTB1 
SELECT 
    MAX(LoadTagID) AS LoadTagID, 
    JobNumber, 
    MAX(EnteredDateTime) AS EnteredDateTime, 
    MAX(Origination) AS Origination 
FROM MyTable 
WHERE CONVERT (Date, EnteredDateTime) >= CONVERT (Date, GETDATE()-10) --Gets the last 10 days. 
GROUP BY JobNumber ORDER BY JobNumber 

INSERT INTO #LTTB2 
select LoadTagID 
,JobNumber 
,EnteredDateTime 
,Origination from (
select *, ROW_NUMBER() Over(partition by jobnumber order by EnteredDateTime) l 
from MyTable 
Where CONVERT (Date, EnteredDateTime) >= CONVERT (Date, GETDATE()-60) 
)lk 
where lk.l=1 

INSERT INTO #LTTB3 
SELECT L.LoadTagID AS LoadTagIDL 
    , L.JobNumber AS JobNumberL 
    , L.EnteredDateTime AS EnteredDateTimeL 
    , L.Origination AS OriginationL 
    , B.LoadTagID, B.JobNumber, B.EnteredDateTime, B.Origination 
FROM #LTTB1 B --MAX 
INNER JOIN #LTTB2 L ON B.JobNumber = L.JobNumber 


Select * From MyTable 
Select * From #LTTB3 

--I hope, your prob has been solved now.. 
+0

Merci. Je pensais que je l'avais travaillé mais ce n'est toujours pas correct. Je pense que faire un Min ou Max à l'Origine fait partie du problème. C'est plus proche, mais le tableau 1 saisit la mauvaise origine. C'est la bonne date. Des idées? Je vous remercie. –