【问题标题】:SQL select first value in a row then insert that value into another columnSQL 选择一行中的第一个值,然后将该值插入另一列
【发布时间】:2014-03-14 04:50:49
【问题描述】:

我不太擅长 sql,所以我不确定这是否可能。或者甚至在excel中?我正在尝试选择第一个值并忽略 Product_ID 中的重复项,然后将该行的第一个值添加到 Title 列。

另请注意,我的产品列表超过 25,000 件。

所以拿这个:

+---------------+------------+-------+-------------+-------+
| Product_Count | Product_ID | Title | _Color_Name | _Size |
+---------------+------------+-------+-------------+-------+
| 2             | 14589      |       | Black       | 00    |
| 3             | 14589      |       | Black       | 0     |
| 4             | 14589      |       | Black       | 2     |
| 5             | 14589      |       | Black       | 4     |
| 6             | 14589      |       | Black       | 6     |
| 11            | 14589      |       | Dark Coral  | 00    |
| 12            | 14589      |       | Dark Coral  | 0     |
| 13            | 14589      |       | Dark Coral  | 2     |
| 14            | 14589      |       | Dark Coral  | 4     |
| 15            | 14589      |       | Dark Coral  | 6     |
| 129           | 15027      |       | Aqua        | 00    |
| 130           | 15027      |       | Aqua        | 0     |
| 131           | 15027      |       | Aqua        | 2     |
| 132           | 15027      |       | Aqua        | 4     |
| 133           | 15027      |       | Aqua        | 6     |
| 138           | 15027      |       | Black       | 00    |
| 139           | 15027      |       | Black       | 0     |
| 140           | 15027      |       | Black       | 2     |
| 141           | 15027      |       | Black       | 4     |
| 142           | 15027      |       | Black       | 6     |
+---------------+------------+-------+-------------+-------+

然后把它变成这样:

+---------------+------------+-------+-------------+-------+
| Product_Count | Product_ID | Title | _Color_Name | _Size |
+---------------+------------+-------+-------------+-------+
| 2             | 14589      | 14589 | Black       | 00    |
| 3             | 14589      |       | Black       | 0     |
| 4             | 14589      |       | Black       | 2     |
| 5             | 14589      |       | Black       | 4     |
| 6             | 14589      |       | Black       | 6     |
| 11            | 14589      |       | Dark Coral  | 00    |
| 12            | 14589      |       | Dark Coral  | 0     |
| 13            | 14589      |       | Dark Coral  | 2     |
| 14            | 14589      |       | Dark Coral  | 4     |
| 15            | 14589      |       | Dark Coral  | 6     |
| 129           | 15027      | 15027 | Aqua        | 00    |
| 130           | 15027      |       | Aqua        | 0     |
| 131           | 15027      |       | Aqua        | 2     |
| 132           | 15027      |       | Aqua        | 4     |
| 133           | 15027      |       | Aqua        | 6     |
| 138           | 15027      |       | Black       | 00    |
| 139           | 15027      |       | Black       | 0     |
| 140           | 15027      |       | Black       | 2     |
| 141           | 15027      |       | Black       | 4     |
| 142           | 15027      |       | Black       | 6     |
+---------------+------------+-------+-------------+-------+

【问题讨论】:

  • 呃..为什么我的桌子看起来像那样.. :(
  • 你应该这样创建表。需要 CREATE TABLE recentDetails" + "(_id 整数主键自增," + "fileName TEXT, filePath TEXT UNIQUE ,fileSize TEXT,fileDate TEXT);
  • 嗯 - 这是 MySql 还是 Sql-Server?我在我的回答 OFC 中假设了 Sql-Server。

标签: sql sql-server excel sql-server-2008


【解决方案1】:

您可以使用PARTITIONProductIds 进行窗口化,然后使用ROW_NUMBER() 标识每个分区中的第一行:

SELECT 
  ProductID, 
  Product_Count, 
  CASE WHEN rn = 1 THEN ProductID else null END AS Title, 
  Color_Name, 
  Size
FROM
(
    SELECT ProductID, Product_Count, Color_Name, Size,
    ROW_NUMBER() OVER (PARTITION BY ProductID ORDER BY Product_Count) AS rn
    FROM product_stock
) AS X;

SqlFiddle here

【讨论】:

  • 不确定如何对其进行分区。但我的桌子上有超过 50,000 种产品。所以这是不切实际的。
  • 我的意思是窗口函数PARTITION BY,而不是表分区函数:) 试试小提琴,看看它是否适合你。
【解决方案2】:

试试这个,

Declare @t table (col1 int,col2 int,col3 int)
insert into @t values(2,3,null),(2,4,null),(5,3,null),(5,4,null)

;with CTE as
(select *,ROW_NUMBER()over(partition by col1 order by col1)rn from @t

)

select a.col1,a.col2,case when a.rn=1 then b.col1 end col3 from CTE a
left join (select col1 from cte where rn>1) b on a.col1=b.col1

【讨论】:

    【解决方案3】:

    使用 UNIQUE 创建表。

    CREATE TABLE recentDetails"
                        + "(_id integer primary key autoincrement,"
                        + "fileName TEXT, filePath TEXT UNIQUE ,fileSize TEXT,fileDate TEXT);
    

    【讨论】:

    • 我仍然需要列出的重复项,但我只需要识别第一个值并将其从 product_ID 复制到 Title 列中,以便我可以导入它。
    【解决方案4】:

    SELECT * from TABLE_NAME WHERE Product_count IN (SELECT MIN(Product_COUNT) FROM TABLE_NAME where Product_ID IN (SELECT DISTINCT Product_ID FROM TABLE_NAME)) AND Product_ID IN (SELECT DISTINCT Product_ID FROM TABLE_NAME)

    【讨论】:

    • 收到此错误:Msg 102,Level 15,State 1,Line 1 '(' 附近的语法不正确。Msg 102,Level 15,State 1,Line 3 '('附近的语法不正确。Msg 102 ,第 15 级,状态 1,第 3 行 ')' 附近的语法错误。
    • 我已经更正了它而不是应该有我修改过的IN
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2014-09-28
    相关资源
    最近更新 更多