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,我有一个SQL Server表,如下所示: 我想做的是显示最近交易的年份和月份 在本例中,我希望显示 ID: 1 Year: 2013 Month: 11 Trades: 2 我尝试使用: select id, MAX(year), MAX(month) from ExampleTable where trades > 0 group by id 我必须连接列吗?您可以使用它根据每行的相对位置(由您的订货人定义)为每行分配一个数字

我有一个SQL Server表,如下所示:

我想做的是显示最近交易的年份和月份

在本例中,我希望显示

ID: 1  
Year: 2013  
Month: 11  
Trades: 2
我尝试使用:

select 
    id, MAX(year), MAX(month) 
from 
    ExampleTable
where 
    trades > 0
group by 
    id
我必须连接列吗?

您可以使用它根据每行的相对位置(由您的订货人定义)为每行分配一个数字:

根据您的示例数据,这将给出:

ID  YEAR    MONTH   TRADES  RowNum
1   2013    11      2       1
1   2013    4       42      2
然后您可以将其限制在
RowNum
为1的位置:

SELECT  ID, Year, Month, Trades
FROM    (   SELECT  ID,
                    Year,
                    Month,
                    Trades,
                    RowNum = ROW_NUMBER() OVER(PARTITION BY ID ORDER BY Year DESC, Month DESC)
            FROM    ExampleTable
            WHERE   Trades > 0
        ) AS t
WHERE   t.RowNum = 1;
如您的示例所示,如果将
存储为
VARCHAR
,则需要在订购前转换为
INT

RowNum = ROW_NUMBER() OVER(PARTITION BY ID 
                            ORDER BY 
                                CAST(Year AS INT) DESC, 
                                CAST(Month AS INT) DESC)

如果您只关心ID为1的记录,只需使用
TOP

SELECT  TOP 1 ID, Year, Month, Trades
FROM    ExampleTable
WHERE   ID = 1
AND     Trades > 0
ORDER BY CAST(Year AS INT) DESC, CAST(MONTH AS INT) DESC;
您可以使用根据每一行的相对位置(由您的订货人定义)为每一行分配一个编号:

根据您的示例数据,这将给出:

ID  YEAR    MONTH   TRADES  RowNum
1   2013    11      2       1
1   2013    4       42      2
然后您可以将其限制在
RowNum
为1的位置:

SELECT  ID, Year, Month, Trades
FROM    (   SELECT  ID,
                    Year,
                    Month,
                    Trades,
                    RowNum = ROW_NUMBER() OVER(PARTITION BY ID ORDER BY Year DESC, Month DESC)
            FROM    ExampleTable
            WHERE   Trades > 0
        ) AS t
WHERE   t.RowNum = 1;
如您的示例所示,如果将
存储为
VARCHAR
,则需要在订购前转换为
INT

RowNum = ROW_NUMBER() OVER(PARTITION BY ID 
                            ORDER BY 
                                CAST(Year AS INT) DESC, 
                                CAST(Month AS INT) DESC)

如果您只关心ID为1的记录,只需使用
TOP

SELECT  TOP 1 ID, Year, Month, Trades
FROM    ExampleTable
WHERE   ID = 1
AND     Trades > 0
ORDER BY CAST(Year AS INT) DESC, CAST(MONTH AS INT) DESC;
为什么将“年”和“月”存储为单独的列?在任何情况下,基本逻辑都是将这两个值结合起来,得到最新的值。这很尴尬,因为您将数字存储为字符串,并且月份不是零填充的。但这并不难:

select id,
       max(year + right('00' + month, 2))
from ExampleTable
group by id;
要将它们分开:

select id,
       left(max(year + right('00' + month, 2)), 4) as year,
       right(max(year + right('00' + month, 2)), 2) as month
from ExampleTable
group by id;
这是一个SQL小提琴。请注意,使用SQL FIDLE时,应将数据库设置为正确的数据库。

为什么要将“年”和“月”存储为单独的列?在任何情况下,基本逻辑都是将这两个值结合起来,得到最新的值。这很尴尬,因为您将数字存储为字符串,并且月份不是零填充的。但这并不难:

select id,
       max(year + right('00' + month, 2))
from ExampleTable
group by id;
要将它们分开:

select id,
       left(max(year + right('00' + month, 2)), 4) as year,
       right(max(year + right('00' + month, 2)), 2) as month
from ExampleTable
group by id;

这是一个SQL小提琴。请注意,当您使用SQL FIDLE时,您应该将数据库设置为正确的数据库。

我不确定是否正确回答了您的问题,但下面的操作是否可行

  SELECT TOP 1 year + '-' + month AS Last, trades
    FROM ExampleTable
   WHERE CAST(trades AS INTEGER) > 0
ORDER BY CAST(year AS integer) DESC, CAST(month AS integer) DESC

我不确定我是否正确回答了你的问题,但下面的问题行得通吗

  SELECT TOP 1 year + '-' + month AS Last, trades
    FROM ExampleTable
   WHERE CAST(trades AS INTEGER) > 0
ORDER BY CAST(year AS integer) DESC, CAST(month AS integer) DESC
试试这个

SELECT TOP 1  ID, [year], trades,
              MAX(Convert(INT,[month])) OVER(PARTITION BY [year]) AS [Month]
FROM ExampleTable 
WHERE trades > 0
试试这个

SELECT TOP 1  ID, [year], trades,
              MAX(Convert(INT,[month])) OVER(PARTITION BY [year]) AS [Month]
FROM ExampleTable 
WHERE trades > 0

这个问题不是很清楚,你能再解释一下吗?是的,有点模糊。假设我想跟踪ID为1的客户的交易。我想看看他上一次至少做了1笔交易的年份和月份。问题不是很清楚,你能解释更多吗?是的,有点模糊。假设我想跟踪ID为1的客户的交易。我想看看他上一次至少做了1笔交易的年份和月份。谢谢Gareth,这正是我想要的。谢谢Gareth,这正是我想要的。