Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:如何从第三列到每行选择最大值?_Sql_Sql Server - Fatal编程技术网

SQL Server:如何从第三列到每行选择最大值?

SQL Server:如何从第三列到每行选择最大值?,sql,sql-server,Sql,Sql Server,我需要为每一行和顺序选择相关表的最大值 请以下表为例,列出用户、项目和购买情况。表Purchases标识每个用户购买的项目 现在,我需要获得按最高购买价值订购的用户列表(如果是按最低购买日期订购) 执行此查询的最佳方式是什么 用户: CREATE TABLE [Users] ( [UserID] [uniqueidentifier] NOT NULL, [UserName] [nvarchar](50) NOT NULL, [Country] [nvarchar](50)

我需要为每一行和顺序选择相关表的最大值

请以下表为例,列出用户、项目和购买情况。表Purchases标识每个用户购买的项目

现在,我需要获得按最高购买价值订购的用户列表(如果是按最低购买日期订购)

执行此查询的最佳方式是什么

用户:

CREATE TABLE [Users]
(
    [UserID] [uniqueidentifier] NOT NULL,
    [UserName] [nvarchar](50) NOT NULL,
    [Country] [nvarchar](50) NOT NULL,

    PRIMARY KEY CLUSTERED ([UserID] ASC)
            WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
                  IGNORE_DUP_KEY= OFF, ALLOW_ROW_LOCKS  = ON, 
                  ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 80) ON [PRIMARY]
) ON [PRIMARY]


INSERT INTO [Users] ([UserID], [userName], [Country])
 VALUES
       (1, 'John', 'France'), (2, 'Mary', 'Germany'), (3, 'Paco', 'Spain'),
       (4, 'Fran', 'Italy'), (5, 'Smith', 'USA'), (6, 'Anna', 'Italy'),
       (7, 'Cris', 'Belgium')


UserID | UserName | Country
-------+----------+-------------
   1   | John     | France
   2   | Mary     | Germany
   3   | Paco     | Spain
   4   | Fran     | Italy
   5   | Smith    | USA
   6   | Anna     | Italy
   7   | Cris     | Belgium
项目:

CREATE TABLE [Items]
(
    [ItemID] [uniqueidentifier] NOT NULL,
    [ItemName] [nvarchar](50) NOT NULL,
    [Value] [int] NULL,

    PRIMARY KEY CLUSTERED ([ItemID] ASC)
            WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
                  IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, 
                  ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 80) ON [PRIMARY]
) ON [PRIMARY]

INSERT INTO [Items] ([ItemID], [ItemName], [Value])
VALUES
       (1, 'Keyboard', 10), (2, 'Mouse', 5),
       (3, 'Display', 40), (4, 'Laptop', 50), (5, 'Tablet', 50)


ItemID | ItemName | Value
-------+----------+-----  
   1   | Keyboard |  10
   2   | Mouse    |   5
   3   | Display  |  40
   4   | Laptop   |  50
   5   | Tablet   |  50
采购:

CREATE TABLE [Purchases]
(
    [UserID] [uniqueidentifier] NULL,
    [ItemID] [uniqueidentifier] NULL,
    [PurchaseDate] [datetime] NULL,

    CONSTRAINT [PK_Purchases] 
        PRIMARY KEY NONCLUSTERED ([UserID] ASC, [ItemID] ASC, [PurchaseDate] ASC)
                    WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
                          IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, 
                          ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 80) ON [PRIMARY]
) ON [PRIMARY]

INSERT INTO [Purchases] ([UserID], [ItemID], [PurchaseDate])
VALUES (3, 4, '2019-01-05'), (1, 2, '2019-02-07'), (3, 5, '2019-01-03'),
       (2, 5, '2019-01-02'), (4, 4, '2019-01-01'), (5, 1, '2019-03-05'),
       (6, 2, '2019-02-15'), (7, 1, '2019-01-01'), (5, 3, '2019-01-07')


UserID | ItemID | PurchaseDate
-------+--------+--------------
   3   |   4    | 2019-01-05
   1   |   2    | 2019-02-07
   3   |   5    | 2019-01-03
   2   |   5    | 2019-01-02
   4   |   4    | 2019-01-01
   5   |   1    | 2019-03-05
   6   |   2    | 2019-02-15
   7   |   1    | 2019-01-01
   5   |   3    | 2019-01-07
这是我需要的查询结果:

UserName | ItemName | Value | PurchaseDate
---------+----------+-------+------------- 
Fran     | Laptop   |   50  | 2019-01-01  
Mary     | Tablet   |   50  | 2019-01-02  
Paco     | Tablet   |   50  | 2019-01-03  
Smith    | Display  |   40  | 2019-01-07  
Cris     | Keyboard |   10  | 2019-01-01  
John     | Mouse    |    5  | 2019-02-07  
Anna     | Mouse    |    5  | 2019-02-15  
这是我现在正在尝试的代码:

SELECT
    T1.UserName, T1.ItemName, T1.Value, T1.PurchaseDate 
FROM 
    (SELECT
         ROW_NUMBER() OVER (PARTITION BY U.UserName ORDER BY I.value DESC, P.PurchaseDate ASC) AS rn, 
         P.PurchaseDate, U.UserName, I.value, I.ItemName 
     FROM 
         Purchases P
     INNER JOIN 
         Items I ON P.ItemID = I.ItemID 
     INNER JOIN 
         Users U ON P.UserID = U.UserID) T1
WHERE
    T1.rn = 1
ORDER BY 
    Value DESC, PurchaseDate ASC

您可以使用窗口功能
FIRST\u VALUE
检索具有最高值的购买的ItemId。然后将这些值连接回Purchases表以获取日期(如果是重复的,我会选择最新的一个)


请告诉我们您尝试了什么我尝试了什么给我们指出了一条可能是错误的路径…这就是为什么我问最好的方法。样本数据最好作为+。请将您的问题包括在内,您当前的尝试和您想要的结果。有关更多详细信息,请为您添加所有内容
;WITH userPurchase AS 
(
    SELECT DISTINCT u.userId, FIRST_VALUE(p.ItemId) OVER (PARTITION BY u.UserId ORDER BY i.Value DESC) as ItemId
    FROM Users u
    INNER JOIN Purchases p
        ON u.UserId = p.UserId
    INNER JOIN Items i
        on p.ItemId = i.ItemId

)
,TopPurchases AS
(
    SELECT p.UserId, p.ItemId, MAX(p.PurchaseDate) as PurchaseDate
    FROM userPurchase u
    INNER JOIN Purchases p
        ON u.userId = p.UserId AND u.ItemId = p.ItemId
        GROUP BY p.UserId, p.ItemId
)
SELECT u.UserName, i.ItemName, i.Value , t.PurchaseDate
FROM TopPurchases t
INNER JOIN Users u 
    ON u.userId = t.userId
INNER JOIN Items i
    ON i.ItemId = t.ItemId
ORDER BY i.Value DESC, t.PurchaseDate