Найти уникальное значение на основе критериев - PullRequest
0 голосов
/ 23 марта 2020

Здравствуйте ... Я пытаюсь выяснить, как искать в столбце ModelName, который может содержать повторяющиеся значения, и посмотреть, содержит ли столбец ReleaseType для той же модели «Final Release». Если да, ничего не делайте, если нет. Верните уникальное имя модели (возможно, на основе последней даты). Зеленые поля - это то, что я пытаюсь показать, а красные - не должны быть видны: enter image description here

Это можно сделать в SQL Server 2019? Вот мои таблицы:

CREATE TABLE [dbo].[Model](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [ModelName] [nvarchar](50) NOT NULL,
    [FormFactorID] [int] NOT NULL,
    [Revision] [nvarchar](4) NOT NULL,
    [SVID] [nvarchar](4) NOT NULL,
    [SSID] [nvarchar](4) NULL,
    [Picture] [varbinary](max) NULL,
    [NVME] [nvarchar](4) NULL,
    [ReleaseStatusID] [int] NULL,
 CONSTRAINT [PK__Model__3214EC27B0574C2B] PRIMARY KEY CLUSTERED



CREATE TABLE [dbo].[ReleaseType](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [ReleaseType] [nvarchar](15) NULL,
 CONSTRAINT [PK__ReleaseT__3214EC27CD0730DB] PRIMARY KEY CLUSTERED



CREATE TABLE [dbo].[ProductRelease](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [ReleaseTypeID] [int] NULL,
    [ModelID] [int] NULL,
    [Date] [date] NULL,
    [ECO] [nvarchar](10) NULL,
    [Notes] [nvarchar](800) NULL,
 CONSTRAINT [PK__ProductR__3214EC27CE911F54] PRIMARY KEY CLUSTERED 

ID из таблицы ReleaseType, объединенной с ReleaseTypeID из таблицы ProductRelease

ID из таблицы Model, объединенной с ModelID из таблицы ProductRelease

Вот мой запрос до сих пор:

SELECT
    dbo.Model.ModelName, 
    dbo.ReleaseType.ReleaseType, 
    dbo.ProductRelease.ECO, 
    dbo.ProductRelease.Date

FROM            
    dbo.Model 
        INNER JOIN dbo.ProductRelease ON dbo.Model.ID = dbo.ProductRelease.ModelID 
        INNER JOIN dbo.ReleaseType ON dbo.ProductRelease.ReleaseTypeID = dbo.ReleaseType.ID

ORDER BY 
    dbo.Model.ModelName, 
    dbo.ProductRelease.Date

1 Ответ

1 голос
/ 23 марта 2020

Да, это возможно, например, с оконными функциями:

WITH cte AS (
   SELECT m.ModelName, 
     rt.ReleaseType, 
     pr.ECO, 
     pr.Date,
     cnt = COUNT(CASE WHEN rt.ReleaseType='Final Release' THEN 1 END) 
           OVER(PARTITION BY m.ModelName),
     rn = ROW_NUMBER() OVER(PARTITION BY m.ModelName ORDER BY pr.Date DESC)
   FROM dbo.Model m
   JOIN dbo.ProductRelease pr
     ON m.ID = pr.ModelID 
   JOIN dbo.ReleaseType rt
     ON pr.ReleaseTypeID = rt.ID
)
SELECT ModelName, ReleaseType, ECO, Date
FROM cte
WHERE cnt = 0   -- exclude groups with 'Final Release'
  AND rn = 1    -- get only newest occurence per ModelName
ORDER BY ModelName;
...