J'ai besoin d'insérer la colonne pincement, nom, département, statutin, statut de code> à partir du tableau DailyDatawh code> dans le tableau Rémydata code> avec la condition et ceci est Ma requête: INSERT INTO DAILYDATAWH (NIP, NAME, DEPARTMENT, STATUSIN, STATUSOUT)
VALUES
('A1', 'ARIA', 'BB', '1/21/2020 8:00:00 AM', '1/21/2020 8:06:22 AM'),
('A1', 'ARIA', 'BB', '1/21/2020 8:16:07 AM', '1/21/2020 9:51:21 AM'),
('A1', 'ARIA', 'BB', '1/21/2020 10:00:00 AM', '1/21/2020 10:06:22 AM'),
('A1', 'ARIA', 'BB', '1/21/2020 11:16:07 AM', '1/21/2020 12:51:21 AM'),
('A1', 'ARIA', 'BB', '1/22/2020 8:05:00 AM', '1/22/2020 8:15:22 AM'),
('A1', 'ARIA', 'BB', '1/22/2020 9:20:07 AM', '1/22/2020 10:00:21 AM');
3 Réponses :
Pour obtenir le résultat souhaité, qui est le Min StatusIn et Max StatusOut de NIP, NOM, DÉPARTEMENT Le moyen le plus simple et le plus simple (pour moi) est d'utiliser le groupe par, il sera fait de toute façon même si vous utilisez une fonction de fenêtres.
--in your original query you use
{...} WHERE LEFT(STATUSIN,13) = {...}
-- which i.e. translates to
SELECT LEFT ('1/21/2020 8:00:00 AM',13)
which result is '1/21/2020 8:0', so it actually compares date, hour and part of the minutes
-- another example
SELECT LEFT ('1/21/2020 10:00:00 AM',13)
results in '1/21/2020 10:', so this case compares only date and hour
Merci de m'avoir aidé, mais j'utilise des agrégations min et max, car je veux simplement sélectionner une date de date minimale dans la colonne Statusin Code> et Maximum DateTime dans la colonne StatusOut code>
Vous pouvez utiliser la fonction de fenêtre:
INSERT INTO SUMMARYDATA(NIP, NAME, DEPARTMENT, STATUSIN, STATUSOUT)
SELECT DISTINCT d.NIP, d.NAME, d.DEPARTMENT,
MIN(d.STATUSIN) OVER (PARTITION BY d.NIP, d.NAME, d.DEPARTMENT, convert(date, d.STATUSIN)) as STATUSIN,
MAX(d.STATUSOUT) OVER (PARTITION BY d.NIP, d.NAME, d.DEPARTMENT, convert(date, d.STATUSOUT)) as STATUSOUT
FROM DAILYDATAWH d;
Merci de m'aider, c'est du travail :) Mais comment insérer cette valeur dans le tableau samaydata code>?
Vous pouvez obtenir des fonctions de classement.
;WITH CTE_Status AS (SELECT NIP, NAME, DEPARTMENT, StatusIn, StatusOut ROW_NUMBER() OVER(PARTITION BY NIP, NAME, DEPARTMENT,CAST(StatusIn AS Date) ORDER BY d.STATUSIN) AS StatusIn_rnk, ROW_NUMBER() OVER(PARTITION BY NIP, NAME, DEPARTMENT, CAST(StatusIn AS Date) ORDER BY d.STATUSOUT DESC) AS StatusOut_rnk FROM DAILYDATAWH d ) SELECT a.NIP, a.Name, a.Department,a.StatusIn, b.StatusOut FROM CTE_Status AS a JOIN CTE_Status AS b ON a.StatusIn_rnk = b.StatusOut_rnk WHERE a.StatusIn_rnk = 1;
Montrez-nous quelques échantillons de données DailyDatawh et ce que vous voulez insérer dans l'autre table. exemple de reproductible minimal
Si vous n'utilisez pas «groupe par», vous ne pouvez pas utiliser les agrégations MIN et Max. D'autre part, sans utiliser "groupe par", min et max, vous insérerez des doublons dans la table (si la clé est effectuée par les 3 champs NIVEAU, NOM, DÉPARTEMENT), qui peut ou non être fausse.
S'il vous plaît vérifier ma question mise à jour @jarlh
Avec cette table des données, ce qui devrait être inséré dans SumexData?
@Dea ananda si vous donnez des données d'échantillons et une sortie attendue, elle sera
J'utilise des agrégations min et max car je veux juste sélectionner une date de date minimale dans la colonne
Statusin Code> et Maximum DateTime dans la colonneStatusOut Code> @giovanniluisoto@Deaananda n'utilise tout simplement pas
groupe par code> et des fonctions agrégées si vous ne le souhaitez pas. Si vous souhaitez que les agrégats, vous avez besoin degroupe par code> ou la clausesur code>. Avec cette donnée de test cependant, vous vous retrouverez avec 6 lignes identiqueset j'utilise où condition parce que je veux juste sélectionner la même date lorsque
Statut code> etSTATUS OUT CODE> Dans la même ligne @giovanniluuisottoDans ce cas, vous avez un grave problème - les cordes de problèmes ne sont pas des dates. L'utilisation de manipulations de chaîne et de comparaison échoue d'une manière ou d'une autre. Utilisez des champs appropriés
DateTime2 CODE> à la place et comparez les dates avec par exemplemoulage (Statusin comme date) = Cast (StatusOut comme date) code>. L'optimiseur de SQL Server est suffisamment intelligente pour convertir cela en une requête de plage pouvant utiliser des index mais i> il ne sera pas en mesure de calculer les statistiques avec précision. Mieux encore, ajoutezdate code> pour contenir les dates et comparer celles-ci. Vous pouvez utiliser une colonne calculée persistée pour cetteS'il vous plaît vérifier ma question mise à jour, il y a des données d'exemple et une sortie attendue @jonway
Pouvez-vous me montrer la requête pour résoudre ce problème? @Panagiotiskanavos
Obtenez votre instruction SELECT CORRECT PREMIER TEST avec un outil qui vous permettra de voir que seul un seul jeu d'enregistrements est renvoyé, alors une fois que cela est correct, déposez-le dans l'insert, entourez la requête entre parenthèses.
Si cela fonctionne, pourquoi avez-vous besoin de le changer?