J'ai une table qui met à jour quotidiennement avec de nouvelles lignes de facture par date. Cependant, chaque nouvelle journée contiendra TOUTES les factures des jours précédents. 1-1-2017 contiendra toutes les factures au 1-1-2017, mais 1-2-2017 contiendra toutes les nouvelles factures ainsi que les factures du 1-1-2017. Voici un exemple ci-dessous.
Je veux être en mesure de montrer seulement les nouveaux records qui apparaissent le 23/03/2017. J'ai essayé avec ce code:
SELECT a.[Date] ,b.[Date] ,a.[Inv Name] ,b.[Inv Name] ,a.[amt] FROM [Invoice Table] a LEFT JOIN [Invoice Table] b ON a.[Inv Name]=b.[Inv Name] WHERE --a.[customer_industry]<>b.[customer_industry] AND a.[Date] = '3/23/2017' AND b.[Date] = '3/22/2017' AND b.[Date] = IS NULL
Quand je cours cela, je n'obtiens aucun résultat. Toute aide est très appréciée!
Tout d'abord, représenter les dates en utilisant les formats standards ISO. Deuxièmement, lors de l'utilisation de LEFT JOIN
, les conditions de tous sauf la première table vont dans la clause ON
. Sinon, les valeurs NULL
des lignes non correspondantes sont filtrées. En outre, = IS NULL
n'est pas une syntaxe valide.
Je pense que vous avez l'intention:
SELECT a.[Date], b.[Date], a.[Inv Name], b.[Inv Name], a.[amt] FROM [Invoice Table] a LEFT JOIN [Invoice Table] b ON a.[Inv Name] = b.[Inv Name] AND b.[Date] = '2017-03-22' WHERE --a.[customer_industry]<>b.[customer_industry] AND a.[Date] = '2017-03-23' AND b.[Date] IS NULL;
Cependant, je pense que ceci est beaucoup plus simplement écrit en utilisant LAG()
:
select t.* from (select t.*, lag(date) over (partition by [Inv Name] order by date) as prev_date from [Invoice Table] t ) t where date = '2017-03-23' and (prev_date is null or prev_date <> '2017-03-22')
SELECT a.[Date] ,b.[Date] ,a.[Inv Name] ,b.[Inv Name] ,a.[amt] FROM [Invoice Table] a LEFT JOIN [Invoice Table] b ON a.[Inv Name]=b.[Inv Name] where b.[Inv Name] Is null